如何解决当两个文件行中的数据相同时,PHP CSV合并两个CSV文件
我有这样的csv01:
A | B | C | D
-----------------------------
905 | bla | meh? | na
16 | meh | meh? | ni
4 | bla | meh? | put
我有这样的csv02:
A | Z | Y
---------------------
4 | info | meh
16 | info | meh
905 | info | meh
这些数字在两个文件中,但顺序不同。有时,数据为空白,因此在这种情况下,结果可能为空白或“空”。
A | B | C | D | Z
-------------------------------------
905 | bla | meh? | na | info
16 | meh | meh? | ni | info
4 | bla | meh? | put | info
我想要做的是基于匹配的数字值905、16、4 ...合并两个CSV(当值相同时,每列的值)
我尝试但没有得到任何结果,它只在一行上输出一些不正确的数据:
<?PHP
$fh = fopen('csv1.csv','r');
$fhg = fopen('csv2.csv','r');
while (($data = fgetcsv($fh,",")) !== FALSE) {
$csv1[3]=$data;
}
while (($data = fgetcsv($fhg,")) !== FALSE) {
$csv2[0]=$data;
}
for($x=0;$x< count($csv2);$x++)
{
if($x==0){
unset($csv1[0][3]);
$line[$x]=array_merge($csv2[0],$csv1[3]); //header
}
else{
$deadlook=0;
for($y=0;$y <= count($csv1);$y++)
{
if($csv1[$y][3] == $csv2[$x][0]){
unset($csv1[$y][3]);
$line[$x]=array_merge($csv2[$x],$csv1[$y]);
$deadlook=1;
}
}
if($deadlook==0)
$line[$x]=$csv2[$x];
}
}
$fp = fopen('final.csv','w');//output file set here
foreach ($line as $fields) {
fputcsv($fp,$fields);
}
fclose($fp);
?>
一直在尝试使用fgetcsv和使用的密钥。我放弃的代码根本无法正常工作。关于如何实现此目标的任何想法吗?
解决方法
这可以在PHP中相对轻松地完成,无需使用Python的Pandas。
a.csv:
905,bla,meh?,na3
16,meh,ni2
4,put1
b.csv:
4,info,meh1
16,meh2
905,meh3
<?php
// load both files to array
$a = array_map('str_getcsv',file('a.csv'));
$b = array_map('str_getcsv',file('b.csv'));
var_dump($a,$b);
// index both arrays by the column you want to merge by
$mergeColumn = 0;
$a = array_combine(array_column($a,$mergeColumn),$a);
$b = array_combine(array_column($b,$b);
var_dump($a,$b);
// construct combined array by combining same indexes from both arrays
// and merging the values (skip merge column from second file so it is not doubled)
$c = [];
foreach ($a as $k => $dataA) {
unset($b[$k][$mergeColumn]);
$c[$k] = array_merge($dataA,$b[$k]);
}
var_dump($c);
// put it to output csv file
$fp = fopen('c.csv','w');
foreach ($c as $row) {
fputcsv($fp,$row);
}
fclose($fp);
输出:
// a.csv as array
array(3) {
[0]=>
array(4) {
[0]=>
string(3) "905"
[1]=>
string(3) "bla"
[2]=>
string(4) "meh?"
[3]=>
string(3) "na3"
}
[1]=>
array(4) {
[0]=>
string(2) "16"
[1]=>
string(3) "meh"
[2]=>
string(4) "meh?"
[3]=>
string(3) "ni2"
}
[2]=>
array(4) {
[0]=>
string(1) "4"
[1]=>
string(3) "bla"
[2]=>
string(4) "meh?"
[3]=>
string(4) "put1"
}
}
// b.csv as array
array(3) {
[0]=>
array(3) {
[0]=>
string(1) "4"
[1]=>
string(4) "info"
[2]=>
string(4) "meh1"
}
[1]=>
array(3) {
[0]=>
string(2) "16"
[1]=>
string(4) "info"
[2]=>
string(4) "meh2"
}
[2]=>
array(3) {
[0]=>
string(3) "905"
[1]=>
string(4) "info"
[2]=>
string(4) "meh3"
}
}
// a.csv keyed by merge column
array(3) {
[905]=>
array(4) {
[0]=>
string(3) "905"
[1]=>
string(3) "bla"
[2]=>
string(4) "meh?"
[3]=>
string(3) "na3"
}
[16]=>
array(4) {
[0]=>
string(2) "16"
[1]=>
string(3) "meh"
[2]=>
string(4) "meh?"
[3]=>
string(3) "ni2"
}
[4]=>
array(4) {
[0]=>
string(1) "4"
[1]=>
string(3) "bla"
[2]=>
string(4) "meh?"
[3]=>
string(4) "put1"
}
}
// b.csv keyed by merge column
array(3) {
[4]=>
array(3) {
[0]=>
string(1) "4"
[1]=>
string(4) "info"
[2]=>
string(4) "meh1"
}
[16]=>
array(3) {
[0]=>
string(2) "16"
[1]=>
string(4) "info"
[2]=>
string(4) "meh2"
}
[905]=>
array(3) {
[0]=>
string(3) "905"
[1]=>
string(4) "info"
[2]=>
string(4) "meh3"
}
}
// combined array
array(3) {
[905]=>
array(6) {
[0]=>
string(3) "905"
[1]=>
string(3) "bla"
[2]=>
string(4) "meh?"
[3]=>
string(3) "na3"
[4]=>
string(4) "info"
[5]=>
string(4) "meh3"
}
[16]=>
array(6) {
[0]=>
string(2) "16"
[1]=>
string(3) "meh"
[2]=>
string(4) "meh?"
[3]=>
string(3) "ni2"
[4]=>
string(4) "info"
[5]=>
string(4) "meh2"
}
[4]=>
array(6) {
[0]=>
string(1) "4"
[1]=>
string(3) "bla"
[2]=>
string(4) "meh?"
[3]=>
string(4) "put1"
[4]=>
string(4) "info"
[5]=>
string(4) "meh1"
}
}
和c.csv(结果):
905,na3,meh3
16,ni2,meh2
4,put1,meh1
如果两个文件都具有与执行合并相同的标识符(第一列),则上述解决方案有效 如果可能存在其他csv文件中不匹配的行,则需要另一种方法。
a.csv:
A,B,C,D
905,put1
1,a,b,c
b.csv:
A,Z,Y
4,meh3
2,d,e
a.csv包含一行A:1,在b.csv中没有匹配的行。 b.csv包含一行A:2,在a.csv中没有匹配的行。 我们希望结果csv具有5行(4、16、905-common + 1(带空Z,Y)+ 2(带空B,C,D))。
代码:
<?php
$a = parseCsv('a.csv');
$b = parseCsv('b.csv');
$allHeaders = array_unique(array_merge($a['header'],$b['header']));
$mergeColumn = 'A';
$a['rows'] = array_combine(array_column($a['rows'],$a['rows']);
$b['rows'] = array_combine(array_column($b['rows'],$b['rows']);
$allIndexes = array_unique(array_merge(array_column($a['rows'],array_column($b['rows'],$mergeColumn)));
$c = [];
foreach ($allIndexes as $index) {
$row = [];
foreach ($allHeaders as $header) {
$row[$header] = '';
if (isset($a['rows'][$index][$header])) {
$row[$header] = $a['rows'][$index][$header];
} elseif (isset($b['rows'][$index][$header])) {
$row[$header] = $b['rows'][$index][$header];
}
}
$c[$index] = $row;
}
var_dump($c);
$fp = fopen('c.csv','w');
fputcsv($fp,$allHeaders);
foreach ($c as $row) {
fputcsv($fp,$row);
}
fclose($fp);
function parseCsv(string $file): array {
$rows = array_map('str_getcsv',file($file));
$header = array_shift($rows);
$csv = [];
foreach($rows as $row) {
$csv[] = array_combine($header,$row);
}
return ['header' => $header,'rows' => $csv];
}
输出:
array(5) {
[905]=>
array(6) {
["A"]=>
string(3) "905"
["B"]=>
string(3) "bla"
["C"]=>
string(4) "meh?"
["D"]=>
string(3) "na3"
["Z"]=>
string(4) "info"
["Y"]=>
string(4) "meh3"
}
[16]=>
array(6) {
["A"]=>
string(2) "16"
["B"]=>
string(3) "meh"
["C"]=>
string(4) "meh?"
["D"]=>
string(3) "ni2"
["Z"]=>
string(4) "info"
["Y"]=>
string(4) "meh2"
}
[4]=>
array(6) {
["A"]=>
string(1) "4"
["B"]=>
string(3) "bla"
["C"]=>
string(4) "meh?"
["D"]=>
string(4) "put1"
["Z"]=>
string(4) "info"
["Y"]=>
string(4) "meh1"
}
[1]=>
array(6) {
["A"]=>
string(1) "1"
["B"]=>
string(1) "a"
["C"]=>
string(1) "b"
["D"]=>
string(1) "c"
["Z"]=>
string(0) ""
["Y"]=>
string(0) ""
}
[2]=>
array(6) {
["A"]=>
string(1) "2"
["B"]=>
string(0) ""
["C"]=>
string(0) ""
["D"]=>
string(0) ""
["Z"]=>
string(1) "d"
["Y"]=>
string(1) "e"
}
}
c.csv:
905,meh1
1,c,2,e
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。