将一列从 CSV 合并/移动到另一列 CSV 作为最后一列

Combine/move one column from CSV to another CSV as last column

提问人:Luke 提问时间:10/27/2022 最后编辑:Luke 更新时间:10/27/2022 访问量:121

问:

我有两个 CSV 文件。第一列包含两列(逗号分隔),第二列仅包含一列。

我正在尝试将它们组合在一起并将列从第二个文件作为最后一列移动到第一个文件。

问题:当我运行脚本时,该列转到第一个文件,但不是附加为最后一列,而是完全替换了文件的内容。

file_1.csv

1,13414214
6,13414214
13,13
3,33129

file_2.csv

title_1
title_2
title_3
title_4

组合时,应该看起来像file_1.csv

1,13414214,title_1
6,13414214,title_2
13,13,title_3
3,33129,title_4

这些文件具有相同的行号。

这就是我目前所拥有的

$file = fopen("file_1.csv","w");
$row = 1;
if (($handle = fopen("file_2.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000)) !== FALSE) {
        $num = count($data);
        $row++;
        echo $data[0]. "\n";
        fputcsv($file, $data);
    }
}
fclose($handle);
fclose($file);

任何帮助都是值得赞赏的。

更新:这是答案的输出

1,13414214
,title_1

6,13414214
,title_2

13,13
,title_3

3,33129
,title_4
php fgetcsv

评论

0赞 RiggsFolly 10/27/2022
数组从 0 开始,而不是从 1 开始,所以设置$row = 0;
1赞 KIKO Software 10/27/2022
为简单起见,我不会尝试写信给 .只需读取 和 ,然后写入 .file_1file_1file_2file_3
0赞 RiggsFolly 10/27/2022
你需要阅读file_1.csv,目前你只打开了它
0赞 RiggsFolly 10/27/2022
这些总是小文件吗?
0赞 Luke 10/27/2022
@RiggsFolly,99% 将在 10-20k 行左右。但有时文件可能超过 100k 行

答:

1赞 KIKO Software 10/27/2022 #1

为简单起见,我不会尝试写信给 .只需读取 和 ,然后写入 .像这样:file_1file_1file_2file_3

$file1 = file("file_1.csv");
$file2 = file("file_2.csv");
$lines3 = [];
foreach ($file1 as $line1No => $line1) {
    $line2 = $file2[$line1No] ?? "";
    $lines3[] = trim($line1) . "," . trim($line2);
}
file_put_contents("file_3.csv", implode(PHP_EOL, $lines3));

正如你所看到的,我将这些文件视为简单的文本文件,而不是CVS文件,因为我不需要对其中的数据做任何事情。

请注意,这仅在包含相同行数时才起作用。file_1.csvfile_2.csv

哦,还有:对于非常大的文件,这可能不是最佳方法。那么,逐行阅读它们可能会更好,尽管速度要慢得多。

评论

0赞 Luke 10/27/2022
谢谢。它在合并它们方面正在工作,但输出的外观有点偏离。它可以在同一条线上吗?我已经用当前输出更新了我的问题
0赞 RiggsFolly 10/27/2022
您需要做的就是删除其换行符trim($file2[$line1No];)
0赞 KIKO Software 10/27/2022
@Luke 按照 RiggsFolly 的建议添加了修剪。这有帮助吗?在答案中使用我的代码之前,我应该给它发短信。让我来做吧。
0赞 Luke 10/27/2022
是的,它有帮助。现在一切都在排队。谢谢!(也会用大文件测试它)
0赞 KIKO Software 10/27/2022
是的,确实如此。现在自己测试了。我以为这会消除新行,这显然是一个错误的假设。file()