【问题标题】:read contents of two csv files in php and merge them into a third file based on a key field在 php 中读取两个 csv 文件的内容并根据关键字段将它们合并到第三个文件中
【发布时间】:2012-09-26 21:13:13
【问题描述】:

我已经在网上搜索并查看了现有答案,但找不到解决方案。我想使用 php 来完成以下任务。这是我的文件:

csv 文件 1:member.csv

member1|john|smith|2009
member2|adam|jones|2007
member3|susie|rose|2002

csv 文件 2:classes.csv

member1|massage|swimming|weights
member2|gym|track|pilates
member3|yoga|running|stretches

我想输出名为 file3.csv 的第三个文件,它根据成员编号这一关键字段将上述两个文件合并在一起。输出应该是这样的:

member1|john|smith|2009|massage|swimming|weights         
member2|adam|jones|2007|gym|track|pilates    
member3|susie|rose|2002|yoga|running|stretches

分隔符是一个竖线字符。我想只使用 php 来做到这一点 - 没有其他语言。

我会非常感谢您的解决方案。

马特

【问题讨论】:

    标签: php csv merge


    【解决方案1】:

    试试这个。它未经测试。

    $arr_one = array();
    if (($fp = fopen("member.csv", "r")) !== FALSE) {
      while (($data = fgetcsv($fp, 1000, ",")) !== FALSE) {
        $arr_one[$data[0]] = $data;
      }
      fclose($fp);
    }
    $arr_two = array();
    if (($fp = fopen("classes.csv", "r")) !== FALSE) {
      while (($data = fgetcsv($fp, 1000, ",")) !== FALSE) {
        $arr_two[$data[0]] = $data;
      }
      fclose($fp);
    }
    $classes_field_count = sizeof(current($arr_two));
    $members = array_keys($arr_one);
    foreach ($members as $key) {
      if (!isset($arr_two[$key])) {
        $arr_two[$key] = range(0, ($classes_field_count - 1));
      }
      unset($arr_two[$key][0]);
      $result_arr[$key] = array_merge($arr_one[$key], $arr_two[$key]);      
    }
    if (($fp = fopen("file3.csv", "w")) !== FALSE) {
      foreach ($result_arr as $fields) {
        fputcsv($fp, $fields, '|');
      }
      fclose($fp);
    }
    

    【讨论】:

    • 仍然得到未定义的索引...对不起,我认为我收到了错误,因为我忘了提到类文件中不存在某些成员,因此需要添加代码如果是这种情况,则在 file3.csv 的空白字段上。
    【解决方案2】:
    <?php
    $data = array();
    if (($handle = fopen('file1.csv', 'r')) !== FALSE) {
        while (($line = fgetcsv($handle, 0, '|')) !== FALSE) {
            $memberId = $line[0];
            unset($line[0]);
            $data[$memberId] = $line;
        }
        fclose($handle);
    }
    if (($handle = fopen('file2.csv', 'r')) !== FALSE) {
        while (($line = fgetcsv($handle, 0, '|')) !== FALSE) {
            $memberId = $line[0];
            unset($line[0]);
            $data[$memberId] = array_merge($data[$memberId], $line);
        }
        fclose($handle);
    }
    ksort($data);       // not needed, but puts records in order by member
    if (($handle = fopen('file3.csv', 'w')) !== FALSE) {
        foreach($data as $key => $value) {
            fwrite($handle, "$key|" . implode('|', $value) . "\n");
        }
        fclose($handle);
    }
    

    【讨论】:

    • 非常感谢您的快速回复。我在输出中途遇到这些错误:注意:未定义的索引:E:\Domains\t\trixysvinyl.com-1032237089\user\htdocs\merge2.php 中的电视第 25 行警告:array_merge() [function.array-合并]:参数 #1 不是 E:\Domains\t\trixysvinyl.com-1032237089\user\htdocs\merge2.php 中的数组,第 25 行警告:array_merge() [function.array-merge]:参数 #1不是第 25 行 E:\Domains\t\trixysvinyl.com-1032237089\user\htdocs\merge2.php 中的数组
    • 文件末尾是否有多余的字符和/或空行?
    【解决方案3】:
    1. 读取两个文件并将数据存储到带有键的数组中:member1, ...

    2. 循环写入新文件行:

    foreach ($firstArray as $key => $value1) {
        $value2 = $secondArray[$key];
    
        // ...
    }
    

    【讨论】:

    • 如果你的文件太大,这并不总是有效,你会耗尽内存。
    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多