循环遍历CSV并打印到新的CSV


Looping through a CSV and printing to a new CSV

我正在从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)