我正在从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);
如果要进行这样的处理,那么每行读取和写入似乎有问题。
在内存中解析整个文件。(我希望不要太大;如果它太大,这将导致问题)。
在这个例子中,我假设你要验证的字段是数字1,你要求和的字段是数字3。
因此,如果我们使用这个csv:(注意前两行在字段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)