繁体   English   中英

根据列值合并/粘贴csv文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM