我有两个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 的新手,我不知道该怎么做。我需要理解逻辑。有人可以帮忙吗?
非常感谢。
--编辑以获得更好的肛门 --基于堆栈溢出上的另一个问题,我尝试了以下代码,但效果不佳。两个 CSV 文件中的两个标头不会合并。它还缺少csv中的所有数据,它只合并了一行数据。
代码是在另一个问题中找到的:使用 php 将两个 csv 文件合并在一起,似乎是我想要实现的目标的完美基础。不幸的是,输出的 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);
?>
$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 节中
打开这两个文件并将内容放在数组 $csv 1[] 和 $csv 2[] 中,因此 $csv 1[0] 是 csv1.csv 的第一行,$csv 1[1] 是 csv1.csv 中的第二行,依此类推,在 $csv 2[] 中相同。
在第 2 节中,
我比较每个数组中的第一个单词,$csv 1[x][0] 和 $csv 2[x][0]。
第一个 if,if($x==0(,是制作标头。 首先,我使用 unset 函数删除第一个单词 contractname,并使用array_merge函数连接 $csv 1[0] 和 $csv 2[0]。
然后,使用这些 我从 $csv 2 数组中选择每行中的第一个单词,并与 $csv 1 数组中每行的第一个单词进行比较。 因此,if($csv 1[$y][0] == $csv 2[$x][0]( 检查第一个单词是否相同,如果它们是相同的字符串,请将其删除并合并这些行。
如果这些单词不同,请将 $csv 2[x] 行保存在数组$line并继续。
在第 3 节中,
将数组中的内容保存在文件中$line。
$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);