PHP比较两个CSV文件并突出显示差异

时间:2014-06-15 23:31:17

标签: php csv

我想比较两个CSV文件,并突出显示它发生的差异。目前我有一个小脚本,可以读取两个CSV文件并将内容打印到浏览器上。这些文件在列号方面的结构相同,但某些行中的值不同,我想强调这种差异,但不确定从哪里开始:

PHP代码:

<?php
$file = fopen("try.csv","r");
$file2 = fopen("try2.csv", "r");

if(! feof($file)){

    while($data = fgetcsv($file))
    {
        foreach($data as $element){
            echo $element.'   ';
        }

        echo '<br />';


    }
}

echo '<br />';
echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>New File<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<";
echo '<br />';

if(! feof($file2)){

    while($data = fgetcsv($file2))
    {
        foreach($data as $element2){
            echo $element2.'   ';
        }

        echo '<br />';


    }
}


fclose($file);
?>

知道变量$element&amp; $element2保留CSV内容如何找到差异....?

2 个答案:

答案 0 :(得分:3)

fgetcsv返回当前行的数组,因此如果内存不是问题,您可以拉入第一个csv的行并将每行存储在像$csv_1这样的数组中然后第二个为$csv_2,然后使用array_udiff查找不重叠的行。

function row_compare($a, $b)
{
    if ($a === $b) {
        return 0;
    }

    return (implode("",$a) < implode("",$b) ) ? -1 : 1;
}

$file1 = new SplFileObject("try.csv");
$file1->setFlags(SplFileObject::READ_CSV);

$file2 = new SplFileObject("try2.csv");
$file2->setFlags(SplFileObject::READ_CSV);

foreach ($file1 as $row) {
    $csv_1[] = $row;
}

foreach ($file2 as $row) {
    $csv_2[] = $row;
}

$unique_to_csv1 = array_udiff($csv_1, $csv_2, 'row_compare');
$unique_to_csv2 = array_udiff($csv_2, $csv_1, 'row_compare');

$all_unique_rows = array_merge($unique_to_csv1,$unique_to_csv2);

foreach($all_unique_rows as $unique_row) {
    foreach($unique_row as $element) {
        echo $element . "   ";
    }
    echo '<br />';
}

答案 1 :(得分:0)

这段代码花了我一些时间,但现在,它可能最简单吗?

$filename="nomes.csv"; //lista completa 
$base="track.opened.csv"; //mark if it is on here 
$NOWcodes = array();

$file = fopen($base, 'r'); //registred opened 
while (($line = fgetcsv($file)) !== FALSE) { array_push($NOWcodes, $line[0]);  }
fclose($file);

$file = fopen($filename, 'r'); //all nomes 
while (($line = fgetcsv($file)) !== FALSE) {

if(!in_array($line[0],$NOWcodes)){$inscrito='yellow;';}
else{$inscrito='#9999ff;';} 

echo '<span style="background-color: '.$inscrito.'" title="'.$line[0].'">'.$line[2].'</span><br>'; }
fclose($file);