【问题标题】:PHP How can I combine two CSVs based on common fields in a rows of each csv?PHP 如何根据每个 csv 行中的公共字段组合两个 CSV?
【发布时间】:2016-01-31 17:16:35
【问题描述】:

我有两个 CSV:

第一个 csv 是这样的:

number | color | size | animal

**1234** | black | big | cat

第二个 csv 是这样的:

name | country | os | number | flavour | yesorno

john | world | windows | **1234** | good | yes

我要做的是根据匹配的数值合并两个 CSV(标题和每行的值):

number | color | size | animal | name | country | os | flavour | yesorno

**1234** | black | big | cat | john | world | windows | good | yes

我一直在尝试使用fgetcsv 并使用密钥,但我真的是 php 的新手,我不知道该怎么做。我需要理解其中的逻辑。有人可以帮忙吗?

非常感谢。

-- 编辑以便更好地理解-- 基于stackoverflow上的另一个问题,我尝试了以下代码,但效果不佳。两个 CSV 文件中的两个标头未合并。它也丢失了 csv 中的所有数据,它只合并了一行数据。

在另一个问题中找到了代码:Merging two csv files together using php,这似乎是我想要实现的目标的完美基础。不幸的是,输出的 csv 格式不正确...

<?php
// 1st section
$fh  = fopen('csv1.csv', 'r');
$fhg = fopen('csv2.csv', 'r');

while (($data = fgetcsv($fh, 0, ";")) !== FALSE) {
    $csv1[] = $data;
}
while (($data = fgetcsv($fhg, 0, ",")) !== FALSE) {
    $csv2[] = $data;
}

// 2nd section

for ($x = 0; $x < count($csv2data); $x++) {
    if ($x == 0) {
        unset($csv1data[0][17]);
        $line[$x] = array_merge($csv2data[0], $csv1data[17]); //header
    } else {
        $deadlook = 0;
        for ($y = 0; $y <= count($csv1data); $y++) {

            if($csv1data[$y][17] == $csv2data[$x][0]){
            unset($csv1data[$y][17]);
            $line[$x]=array_merge($csv2data[$x],$csv1data[$y]);
            $deadlook=1;
            }
        }
        if ($deadlook == 0)
            $line[$x] = $csv2data[$x];
    }
}
// 3 section    
$fp = fopen('final.csv', 'w'); //output file set here

foreach ($line as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);
?> 

【问题讨论】:

  • 你是如何尝试使用fgetcsv的?请表现出一些努力
  • @Trix:我已经编辑了我的问题。

标签: php csv fgetcsv


【解决方案1】:
     $fh = fopen('csv1', 'r');
        $fhg = fopen('csv2', 'r');
         while (($data = fgetcsv($fh, 0, ",")) !== FALSE) {
            $csv1[]=$data;
        }
        while (($data = fgetcsv($fhg, 0, ",")) !== FALSE) {
                $csv2[]=$data;
        }
 // 2nd section
        for($x=0;$x< count($csv2);$x++)
        {
            if($x==0){
                unset($csv1[0][0]);
                $line[$x]=array_merge($csv2[0],$csv1[0]); //header
            }
            else{
                $deadlook=0;
                for($y=0;$y <= count($csv1);$y++)
                {
                    if($csv1[$y][0] == $csv2[$x][0]){
                        unset($csv1[$y][0]);
                        $line[$x]=array_merge($csv2[$x],$csv1[$y]);
                        $deadlook=1;
                    }
                }
                if($deadlook==0)
                    $line[$x]=$csv2[$x];
            }
        }
  // 3 section
        $fp = fopen('final.csv', 'w');//output file set here

        foreach ($line as $fields) {
            fputcsv($fp, $fields);
        }
        fclose($fp);

在第 1 节中

打开这两个文件并将内容放入数组 $csv1[] 和 $csv2[] 中,因此 $csv1[0] 是 csv1.csv 中的第一行,$csv1[1] 是 csv1 中的第二行.csv 等,在 $csv2[] 中也一样。

在第 2 节中,

我比较每个数组中的第一个单词 $csv1[x][0] 和 $csv2[x][0]。

第一个 if, if($x==0), 是做标题。首先,我使用 unset 函数删除第一个单词 contractname 并使用 array_merge 函数加入 $csv1[0] 和 $csv2[0]。

然后,使用这些 for i 从 $csv2 数组中选择每一行中的第一个单词,并与 $csv1 数组中每一行中的第一个单词进行比较。所以, if($csv1[$y][0] == $csv2[$x][0]) 检查那些第一个单词是否相同,如果它们是相同的字符串,删除它并合并这些行。

如果这些单词不同,则将 $csv2[x] 行保存在 $line 数组中并继续。

在第 3 节中,

将 $line 数组中的内容保存到文件中。

【讨论】:

  • 谢谢,但它不起作用我收到错误通知:“Undefined offset: 0 on line 21”和“Undefined offset: 19 on line 21”。这些错误对应于: if($csv1[$y][0] == $csv2[$x][0]) ,我认为。
【解决方案2】:
    $fromFile = fopen($REcsv,'r');
    $fromFile2 = fopen($pathToFile,'r');
    $toFile = fopen($reportFile,'w');
    $delimiter = ';';
    $line = fgetcsv($fromFile, 65536, $delimiter);
    $line2 = fgetcsv($fromFile2, 65536, $delimiter);

    while ($line !== false) {
        while ($line2 !== false) {
            fputcsv($toFile, array_merge($line2,$line), $delimiter);
            $line = fgetcsv($fromFile, 65536, $delimiter);
            $line2 = fgetcsv($fromFile2, 65536, $delimiter);
        }
    }
    fclose($fromFile);
    fclose($fromFile2);
    fclose($toFile);

【讨论】:

    猜你喜欢
    • 2019-08-14
    • 2015-04-29
    • 1970-01-01
    • 2016-01-12
    • 2010-10-24
    • 2015-12-22
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多