我正在尝试通过
preg_match_all()
将 data.txt 中的多行填充到 data.csv 中的单行或列。它需要位于单个数组中,因为我只需要唯一的数字(或仅获取唯一数字的任何其他选项)。
我无法将数组合并为单个数组并将其像一个数组填充为单行那样填充。
这是我的简化代码:
$filename = 'data.txt';
$fupids = array ();
$handle = fopen($filename, "r");
if (!$handle) {
exit;
}
while (($line = fgets($handle)) !== false) {
if (preg_match_all('/([0-9]{8})/',$line,$output)) {
$fupid = $output[0];
$file = fopen('data.csv', 'a+');
fputcsv($file, array_unique($output[0]));
}
}
fclose($file);
这是我的简化数据.txt:
10153231,10159512,10159512,10159512
10141703,10160541,10160541
10165815,10158007,10158007
当前 csv 输出:
10153231,10159512
10141703,10160541
10165815,10158007
我想要的输出只是一行,或者更好的是一列,如下所示:
10153231,10159512,10141703,10160541,10165815,10158007
也许是这样的(未测试):(想法:重复的键被
array_merge
覆盖)
$filename = 'data.txt';
$fupids = [];
if ( false === $hin = fopen($filename, 'r') )
throw new Exception('unable to open input file');
if ( false === $hout = fopen('data.csv', 'a+') )
throw new Exception('unable to open output file');
while ( false !== $fields = fgetcsv($hin) ) {
$fupids = array_merge($fupids, array_flip($fields));
}
fclose($hin);
fwrite($hout, implode(',', array_keys($fupids)));
fclose($hout);
如果您满意使用
preg_match_all()
(而不是仅仅解析每个逗号分隔的行),那么您可以将 file_get_contents()
作为正则表达式函数的输入传递,然后将 array_unique()
匹配传递给 的循环调用fputcsv()
将单列行添加到您的 data.csv
。
您的编码意图似乎是将数据附加到
data.csv
。fopen()
的第二个参数:
'a' - 仅开放用于写入;将文件指针放在文件末尾。如果该文件不存在,请尝试创建它。
if (preg_match_all('/\b\d{8}\b/', file_get_contents($filename), $m)) {
$file = fopen('data.csv', 'a');
foreach (array_unique($m[0]) as $fupid) {
fputcsv($file, [$fupid]);
}
fclose($file);
}
如果您想将单行(具有不确定的列数)附加到 csv 文件,那么您不需要循环:
if (preg_match_all('/\b\d{8}\b/', file_get_contents($filename), $m)) {
$file = fopen('data.csv', 'a');
fputcsv($file, array_unique($m[0]));
fclose($file);
}