通过CSV循环并打印到新的CSV

时间:2014-08-19 16:06:57

标签: php 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 个答案:

答案 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)