我想比较两个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内容如何找到差异....?
答案 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);