我正在从csv中读取信息,对其进行一些更改并将其写入新的CSV。我希望能够在进入下一行之前检查字段的值($ row [14])。如果该值与之前的值相同,那么我希望将该行的值添加到当前行。
这是我的PHP
$file = fopen("tesy-3.csv","r");
if ($file) {
$fp = fopen('mailchimp.csv', 'w');
while ( $row = fgetcsv( $file, ";" ) ) {
if ($email = $row[14] == $email) {
array_push($data, $row[2],
$row[3],
$row[14],
$row[6] . ' ' . $row[7] . ' ' . $row[8],
$row[11] . ' ' . $row[10] . ', ' . $row[12],
jdtogregorian ( jewishtojd($Hebmonth, $row[6], 5774 ))
);
} else {
$data = array ( $row[2],
$row[3],
$row[14],
$row[6] . ' ' . $row[7] . ' ' . $row[8],
$row[11] . ' ' . $row[10] . ', ' . $row[12],
jdtogregorian ( jewishtojd($Hebmonth, $row[6], 5774 ))
);
}
$email = $row[14];
fputcsv($fp, $data);
}
}
fclose($fp);
答案 0 :(得分:0)
如果你要进行这样的处理,每行的阅读和写作似乎都有问题。
而是将整个文件解析在内存中。 (我希望不是太大;如果它太大,这将导致问题)。
在这个例子中,我假设您要验证的字段是数字1,而您要求和的字段是数字3.
所以,如果我们采用这个csv :(注意前2行在字段1中具有相同的no
值)
io;no;pat;10
su;no;ret;12
se;mi;sol;15
并使用此代码:
<?php
$file = explode("\n", file_get_contents("tesy-3.csv"));
$output = fopen('mailchimp.csv', 'w');
$csv = array_map(function ($x) { return str_getcsv($x, ';'); }, $file);
$result = array_reduce($csv, function ($a, $b) {
// $values is an array containing only the field 1 of each line.
$values = array_map(function ($x) { return $x[1]; }, $a);
if (isset($b[1])) {
// Check if the current field 1 already is set in a previous line
$key = array_search($b[1], $values);
if ($key !== false) {
// The field is already set, so we do the sum
$a[$key][3] += $b[3];
} else {
// Is not set, so we just push the line
array_push($a, $b);
}
}
return $a;
}, Array());
foreach($result as $line) {
fputcsv($output, $line);
}
fclose($output)
输出是这样的:
io,no,pat,22
se,mi,sol,15
结果将字段编号3的值相加。 (10 + 12)