我有一个具有以下值的现有 csv 文件
column1 column2
Fr-fc Fr-sc
Sr-fc Sr-sc
Run Code Online (Sandbox Code Playgroud)
我想在其中添加 2 个新列并实现以下格式
column1 column2 column3 column4
Fr-fc Fr-sc 1 2
Sr-fc Sr-sc 1 2
Run Code Online (Sandbox Code Playgroud)
如果我使用以下代码,它会在新创建的列的列数据中插入相同的列标题值
$a = file('amit.csv');// get array of lines
$new = '';
foreach($a as $line){
$line = trim($line);// remove end of line
$line .=";column3";// append new column
$line .=";column4";// append new column
$new .= $line.PHP_EOL;//append end of line
}
file_put_contents('amit2.csv', $new);// overwrite the same file with new data
Run Code Online (Sandbox Code Playgroud)
我如何才能实现上述目标?
fgetcsv您可以分别使用 php 的内置 csv 函数和来简化您的工作,而不是重新发明轮子fputcsv。首先读取每一行并将fgetcsv数据存储在多维数组中:
$delimiter = "\t"; //your column separator
$csv_data = array();
$row = 1;
if (($handle = fopen('test.csv', 'r')) !== FALSE) {
while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
$csv_data[] = $data;
$row++;
}
fclose($handle);
}
Run Code Online (Sandbox Code Playgroud)
接下来编辑行以使用array_merge添加额外的列:
$extra_columns = array('column3' => 1, 'column4' => 2);
foreach ($csv_data as $i => $data) {
if ($i == 0) {
$csv_data[$i] = array_merge($data, array_keys($extra_columns));
} else {
$csv_data[$i] = $data = array_merge($data, $extra_columns);
}
}
Run Code Online (Sandbox Code Playgroud)
最后用于fputcsv将每一行输入到 csv 中。
if (($handle = fopen('test.csv', 'w')) !== FALSE) {
foreach ($csv_data as $data) {
fputcsv($handle, $data, $delimiter);
}
fclose($handle);
}
Run Code Online (Sandbox Code Playgroud)
您可以组合这些步骤,通过减少循环次数来提高代码效率。
这种方法代码较少
<?php
$inFile = fopen('test.csv','r');
$outFile = fopen('output.csv','w');
$line = fgetcsv($inFile);
while ($line !== false) {
$line[] = 'third column';
$line[] = 'fourth column';
fputcsv($outFile, $line);
$line = fgetcsv($inFile);
}
fclose($inFile);
fclose($outFile);
Run Code Online (Sandbox Code Playgroud)