使用PHP写入多个(拆分)CSV文件

时间:2011-12-03 08:12:51

标签: php csv

我正在使用一个简单的函数将写入数组写入CSV文件,如下所示:

function writeToCSV($array) {
    $fp = fopen('programmes.csv', 'a');
    fputcsv($fp, $array);
    fclose($fp);
}

简单如馅饼。但是,无论如何知道指针所在的行号是什么?因为我希望能够在1000行之后开始写入新文件。为什么?因为我需要能够稍后将它们导入到数据库中并且存在一些内存限制,并且解析具有15000行的CSV文件是禁止的。

3 个答案:

答案 0 :(得分:3)

function writeToCSV($array) {
    $i = 1;
    $j = 1;
    $fp = fopen('programmes' . $j . '.csv', 'a');
    foreach($array as $fields) {
        if ($i % 1000 == 0) {
            fclose($fp);
            $fp = fopen('programmes' . $j . '.csv', 'a');
            $j = $j + 1;
        }
        fputcsv($fp, $fields);
        $i = $i + 1;
    }
    fclose($fp);
}

答案 1 :(得分:0)

试试这个:

count(file('programmes.csv'));

这将为您提供文件中的行数。

答案 2 :(得分:0)

我没试过,如果这样可行,但我会做这样的事情:

<?php
function writeToCSV($array) {
  // count lines in the current file
  $linecount = 0;
  $fh = fopen('programmes.csv','rb') or die("ERROR OPENING DATA");
  while (fgets($fh) !== false) $linecount++;
  fclose($fh);

  $aSize = sizeof($array);
  if (($linecount + $aSize) > 1000) {
    // split array
    $limit = 1000 - $linecount;
    $a = array_slice($array, 0, $limit);
    $b = array_slice($array, $limit);
    // write into first file
    $fp = fopen('programmes.csv', 'a');
    foreach($a as $field) fputcsv($fp, $field);
    fclose($fp);

    // write into second file
    $fp = fopen('programmes2.csv', 'a');
    foreach($b as $field) fputcsv($fp, $field);
    fclose($fp);
  } else {
    $fp = fopen('programmes.csv', 'a');
    $idx = 0;
    while ($linecount < 1000) {
      // fill the file to the 1000 lines
      fputcsv($fp, $array[$idx]);
      ++$linecount;
      ++$idx;
    }
    fclose($fp);

    if ($idx != $aSize) {
      // create new file
      $fp = fopen('programmes.csv', 'a');
      while ($idx< $aSize) {
        // fill the file to the 1000 lines
        fputcsv($fp, $array[$idx]);
        ++$idx;
      }
      fclose($fp);
    }
  }
}
?>