【问题标题】:In PHP compare 2 csv, add data from 1 csv if there are matches and write to new csv在 PHP 中比较 2 个 csv,如果有匹配项,则从 1 个 csv 添加数据并写入新的 csv
【发布时间】:2016-04-18 16:01:13
【问题描述】:

我需要比较两个 csv 文件。我每天都会收到一个带有新产品的新产品,还有一个包含所有库存产品的新产品。 如果通过比较 sku 在两个文件中有相同的产品,我有工具。新产品的第一个 csv 可能有多次相同的 sku。因此,如果有匹配项,我需要将第二个 csv 中的 Prod.ID 添加到新列中第一个 csv 中的 sku 中。

这是第一个 csv 的样子:

ID      SKU         Cat         Price
0       12345678    Clothes     10.00
0       12345678    Clothes     10.00
0       87654321    Bath        5.00

第二个文件是这样的

ID     SKU         Cat         Price
321    12345678    Clothes     10.00
532    87654321    Bath        5.00

所以我需要将第二个 csv 中的 ID 添加到第一个 csv 中的每个匹配的 SKU 中,并将其保存到一个非常新的 csv 中,最终得到的 ist 如下所示:

ID      SKU         Cat         Price
321     12345678    Clothes     10.00
321     12345678    Clothes     10.00
532     87654321    Bath        5.00

现在我有以下代码,但我只得到一个空的 updated.csv。我完全卡住了:(

$fp = fopen('updated.csv', 'w');

$csvFile1 = "firts-file.csv";
$handle1 = fopen($csvFile1, "r");

$csvFile2 = "second-file.csv";
$handle2 = fopen($csvFile2, "r");

while(($data1 = fgetcsv($handle, 20000, ";")) && ($data2 = fgetcsv($handle2, 20000, ";" ))) {
    $oldID = $data1[0];
    $newID = $data2[0];       
    if(($data1[1]) == ($data2[1])) {

        fputs($fp, str_replace($oldID, $newID, "\n"));
    }
}

【问题讨论】:

  • 你描述你的 2 个输入文件的方式,它们不是 .csv 文件所以因为我们不明白你实际上在问这个问题而你的其他问题不是得到答复。 C 代表逗号 S 代表分隔 V 代表变量 您的文件描述包含 NOT COMMAS
  • 如果您可以再次尝试正确描述输入和您想要做什么以及输出的格式,您实际上可能会让某人尝试回答
  • 输入为 csv。如果我在 OOo 或 Excel 中打开它们,我会得到如上所述的 Coulumns。我需要检查这两个文件是否有相同的 SKU,如果有,则将文件 1 中的 ID '0' 替换为每次匹配时文件中的 ID,并将更改的数据保存到新的 csv 中。

标签: php csv save compare


【解决方案1】:

1.csv - $result

ID      SKU         Cat         Price
0       12345678    Clothes     10.00
0       12345678    Clothes     10.00
0       87654321    Bath        5.00

2.csv - $source

ID     SKU         Cat         Price
321    12345678    Clothes     10.00
532    87654321    Bath        5.00

代码

<?php
    $csvHandleOne = fopen('1.csv', "r");
    $source = $result = array();
    while($data = fgetcsv($csvHandleOne, 2048, ";")) {
        $result[] = $data;
    }
    fclose($csvHandleOne);

    $csvHandleTwo = fopen('2.csv', "r");
    while($data = fgetcsv($csvHandleTwo, 2048, ";")) {
        //We are interested only in SKU and ID link
        $source[$data[1]] = $data[0];
    }
    fclose($csvHandleTwo);

    $csvHandleResult = fopen('result.csv', "w");
    foreach ($result as $key => $value) {
        if($key && isset($source[$value[1]])) {
            //SKU => ID link found in source. Set id to $result
            $value[0] = $source[$value[1]];
        }
        fputcsv($csvHandleResult, $value, ';');
    }
    fclose($csvHandleResult);

【讨论】:

  • 为了使回答对提问者和未来的访客有用,请务必说明您所做的事情以及这样做的原因。
  • 谢谢。它工作完美。对于令人困惑的帖子,我们深表歉意。我试图编辑第一篇文章,但点击编辑后,我总是从我的第二篇文章中获得内容。再来一次。太棒了。 :)
猜你喜欢
  • 2022-01-26
  • 2018-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 2019-07-20
  • 1970-01-01
  • 2016-07-13
相关资源
最近更新 更多