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

时间:2022-09-15 16:34:33

I'm using a simple function to write write arrays to a CSV-file, which look like this:

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

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

Simple as a pie. However, is there anyway to know what line-number the pointer is at? Because I want to be able to after 1000 lines to begin writing to a new file. Why? Because I need to be able to import them to a database later with some memory constraints, and to parse a CSV-file with 15000 lines is a no-no.

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

3 个解决方案

#1


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);
}

#2


0  

Try this:

尝试这个:

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

This will give you the number of lines in a file.

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

#3


0  

I haven't tried if this works, but i would do something like this:

我没有尝试,如果这工作,但我会做这样的事情:

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

#1


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);
}

#2


0  

Try this:

尝试这个:

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

This will give you the number of lines in a file.

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

#3


0  

I haven't tried if this works, but i would do something like this:

我没有尝试,如果这工作,但我会做这样的事情:

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