【问题标题】:fputcsv, multiple arrays into one row or columnfputcsv,多个数组成一行或一列
【发布时间】:2018-04-21 12:31:56
【问题描述】:

我试图找到答案,但我没有成功,请帮助。

我正在尝试通过 preg_match 将 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);

这是我的简化 data.txt :

10153231,10159512,10159512,10159512
10141703,10160541,10160541
10165815,10158007,10158007

当前 csv 输出:

10153231,10159512
10141703,10160541
10165815,10158007

理想的输出只有一行,或者最好是一列,如下所示:

10153231,10159512,10141703,10160541,10165815,10158007

感谢大家的帮助。

【问题讨论】:

  • 您的脚本启动时文件data.csv 是否已经存在?好吧,你想要什么?一行还是一列?另外,输入文件的大小是多少?
  • 没关系,但是 data.csv 存在并且它是空的。就像我说的那样,不管是一行还是一列,我都会采用这两种解决方案。输入文件的大小是150mb的文本数据日志。如果我能得到这组数据的解决方案,将其转换为1行或1列,我将完全满意。

标签: output row preg-match-all fputcsv array-unique


【解决方案1】:

可能是这样的(未测试):(想法:重复的键被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);

【讨论】:

  • 出现以下错误:注意:未定义变量:第 18 行 C:\...\selectfup id.php 中的 fupid 警告:array_keys() 期望参数 1 为数组,在 C 中给出 null: \...\selectfupid.php 第 18 行警告:implode(): Invalid arguments pass in C:\...\selectfupid.php on line 18
  • @Simon:这只是一个错字,$fupid => $fupids
  • 我用 $array = array_merge($array,$output[0]);