Php 循环浏览CSV并打印到新的CSV

Php 循环浏览CSV并打印到新的CSV,php,csv,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 ($

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

并使用此代码:

<?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)

结果将字段编号3的值相加。(10+12)

如果你不知道它是否太大,那就有点愚蠢了,因为你有一些与他的问题无关的代码,你想粘贴到一个答案中,这是一个相当大的文件6000多行。我只是修改了我的代码,它几乎做了我想做的事情,只是每次添加更多内容时,它都用相同的值写入行。我怎样才能修改它,使它只写一次并添加重复的值。哦,我的糟糕之处在于没有先询问文件的长度。但是,不,这不是我想粘贴的代码。但是,是的,我应该先问一下。话虽如此,如果具有相同字段的行确实是连续的,我认为应该很有可能更改操作代码来完成这项工作。但是如果行不一定是连续的,而是可以是任意顺序的,我认为有必要将整个文件保存在内存中。在这种情况下,我认为我的解决方案是可以接受的。但也许我大错特错了XD。你怎么看?我在导出CSV之前做了一个订单。所以它们是连续的。我编辑了关于的代码。你知道我怎样才能让添加值的行只打印一次吗?你说的是添加哪些字段?如果您得到两个连续的行,其中第[14]行是相同的。关于数据的一些想法也可能有用
<?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