php / merge 2 .csv文件到一个

时间:2017-07-19 09:26:50

标签: php csv

我有2个需要合并的csv文件。

file1.csv:

col1,col2,col3,col4
val1,val2,val3,val4

file2.csv:

col2,col4,col5
val22,val42,val5

我需要合并这两个文件并使用此内容创建第三个文件:

col1,col2,col3,col4,col5
val1,val2,val3,val4,val5
val1,val22,val3,val42,val5

这是我的尝试,但结果是错误的:

$csv1 = file('file1.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$csv2 = file('file2.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$lines = max(count($csv1), count($csv2));
$finalcsv = array();
for($i=0; $i<$lines; $i++) {
  if(isset($csv1[$i])) $finalcsv[] = $csv1[$i];
  if(isset($csv2[$i])) $finalcsv[] = $csv2[$i];
}

file_put_contents('file3.csv', implode(PHP_EOL, $finalcsv));

这是代码的结果,但它不是我需要的

col1,col2,col3,col4
col2,col4,col5
val1,val2,val3,val4
val22,val42,val5

1 个答案:

答案 0 :(得分:0)

获取csv标头列并将其用作值的索引:

$csv1Headers = explode(',', $csv1[0]);
$csv2Headers = explode(',', $csv2[0]);
$mergedHeaders = array_unique(array_merge($csv1Headers, $csv2Headers));

$lines = max(count($csv1), count($csv2));
$finalcsv = array(implode(',', $mergedHeaders));
for ($i = 1; $i < $lines; $i++) {
    if (isset($csv1[$i])) {
        // combine arrays, use an array of nulls to maintain order.
        $finalcsv[] = implode(',', array_merge(
                array_combine($mergedHeaders, array_fill(0, count($mergedHeaders), null)),
                array_combine($csv2Headers, explode(',', $csv2[$i])),
                array_combine($csv1Headers, explode(',', $csv1[$i]))
            )
        );
    }
    if (isset($csv2[$i])) {
        $finalcsv[] = implode(',', array_merge(
                array_combine($mergedHeaders, array_fill(0, count($mergedHeaders), null)),
                array_combine($csv1Headers, explode(',', $csv1[$i])),
                array_combine($csv2Headers, explode(',', $csv2[$i]))
            )
        );
    }
}