[英]Merge/paste csv files based on a column value
我在php或linux上找不到任何特定的示例来执行此操作:
第一个csv文件 :
field1;field2;field3;...
one; two; three;...
第二个csv文件 :
field4;field3;field7;...
some; three; ok;
some; four; notok;
如您所见,他们有共同的field3
因此,其中field3.1st csv = field3.2nd csv例如 这里三三
我需要最终的csv:
field1;field2;field3;field4;field3;field7
one; two; three; some; three; ok;
...
...
...
我试图用PHP做到这一点
$lines = file($csvone);
$lined = file($csvtwo);
$listf = "/home/myuser/public_html/folder/finallist.csv";
$fh = fopen($listf, 'wa+') or die("can't open file");
foreach ($lines as $line_num => $line) {
$arr = explode(";",$line);
$ref = $arr[2];
$ref = rtrim($ref);
echo "$ref \n";
foreach ($lined as $fine_num => $fine) {
$brr = explode(";",$fine);
$refe = $brr[1];
$refe = rtrim($refe);
echo "$refe \n";
if ($ref == $refe) {
echo "$ref equal to $refe ! \n";
$stringData = "$arr[0];$arr[1];$arr[2];$arr[3];$arr[4];$arr[5];$arr[6];$arr[7];$arr[8];$arr[9];$arr[10];$arr[11];$brr[0];$brr[1];$brr[2];$brr[3];$brr[4];$brr[5];$brr[6];$brr[7];$brr[8];$brr[9];$brr[10];$brr[11];$brr[12];$brr[13]";
$stringData = str_replace(array("\r","\n"),"",$stringData);
$stringData .= PHP_EOL;
fwrite($fh, $stringData);
}
}
}
fclose($fh);
显然,它可以工作,但是花费的时间太长(确实太多)。
拜托,最快的方法是什么?
还赞赏通过Linux命令行解决方案(如果可能,请使用CentOS)
谢谢!
您应该使用break;
如果找到了匹配项并以最终CSV格式写成,
if ($ref == $refe) {
echo "$ref equal to $refe ! \n";
$stringData = "$arr[0];$arr[1];$arr[2];$arr[3];$arr[4];$arr[5];$arr[6];$arr[7];$arr[8];$arr[9];$arr[10];$arr[11];$brr[0];$brr[1];$brr[2];$brr[3];$brr[4];$brr[5];$brr[6];$brr[7];$brr[8];$brr[9];$brr[10];$brr[11];$brr[12];$brr[13]";
$stringData = str_replace(array("\r","\n"),"",$stringData);
$stringData .= PHP_EOL;
fwrite($fh, $stringData);
break; // break the loop here for unwanted cycles
}
另外,如果您使用了$lined
数组中的一行,则可以将其取消设置,以使$lined
数组更短,并且第二个循环的迭代次数更少。 在使用break;
之前,只需使用以下行break;
unset($lined[$fine_num]);
您的第二个循环可以进行优化,例如,
foreach ($lined as $fine_num => $fine) {
$brr = explode(";",$fine);
$refe = $brr[1];
$refe = rtrim($refe);
echo "$refe \n";
if ($ref == $refe) {
echo "$ref equal to $refe ! \n";
$stringData = "$arr[0];$arr[1];$arr[2];$arr[3];$arr[4];$arr[5];$arr[6];$arr[7];$arr[8];$arr[9];$arr[10];$arr[11];$brr[0];$brr[1];$brr[2];$brr[3];$brr[4];$brr[5];$brr[6];$brr[7];$brr[8];$brr[9];$brr[10];$brr[11];$brr[12];$brr[13]";
$stringData = str_replace(array("\r","\n"),"",$stringData);
$stringData .= PHP_EOL;
fwrite($fh, $stringData);
unset($lined[$fine_num]); // unset so that next time loop will interate less
break; // break here
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.