【问题标题】:How to Write Multiple Rows/Arrays to CSV File in one attempt using PHP? [closed]如何使用 PHP 一次尝试将多行/数组写入 CSV 文件? [关闭]
【发布时间】:2018-03-09 03:27:13
【问题描述】:

我必须在 csv 文件中写入多条记录。我正在使用 php 的 fputcsv 函数,它将数组作为一行并将其写入文件中。这样,每一行都会有多个写操作。

我正在寻找一种方法,可以在一次写入操作中将多行写入 csv 文件。

请帮忙。

【问题讨论】:

  • 那么就用fwrite?
  • 与我们分享您的代码,看看您到目前为止尝试了什么。
  • @Michael 谢谢!成功了
  • 这个问题可以用更多的细节和上下文来获得合理的答案。为什么一次写一行不是一种选择?多少是倍数; 2 行,2 亿行?

标签: php file csv file-handling fputcsv


【解决方案1】:

如果您担心进行多次写入操作,您可以将 csv “写入”到输出缓冲区,使用ob_start()/ob_get_clean() 捕获输出缓冲区,然后将缓冲区转储到 csv 中,如下所示:

<?php
$handle = fopen("php://output", "w");
$data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
ob_start();
foreach ($data as $dat) {
    fputcsv($handle, $dat);
}
$csvContent = ob_get_clean();
file_put_contents("csv.csv", $csvContent);

【讨论】:

    【解决方案2】:

    解决方案 1: 将数据保存在字符串中,然后使用 fwrite 有效!

    代码:

    $file = 'test.csv';
    
    $file = fopen($file, 'w');
    
    $content = '';
    
    for($i=0;$i<10;$i++){
        $content.="a,b,c,d\r\n";
    }
    
    fwrite($file, $content);
    
    fclose($file);
    

    解决方案 2: 由 @chiliNUT 建议,使用输出缓冲区。

    代码:

    $handle = fopen("php://output", "w");
    $data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
    ob_start();
    foreach ($data as $dat) {
        fputcsv($handle, $dat);
    }
    $csvContent = ob_get_clean();
    file_put_contents("csv.csv", $csvContent);
    

    【讨论】:

      【解决方案3】:

      这是一个使用内存流的示例。它应该为您提供一个结构,您可以自定义该结构以分段处理缓冲区并在缓冲区变得太大时重置进度。

      <?php
      // Sample data
      $arrData = array(
        array("Fruit","Color","Calories"),
        array("Apple","Red",95),
        array("Orange","Orange",45),
        array("Plum","Purple",45)  
      );
      
      // Open output file
      $fpOut = fopen("bufferedWrite.csv", "w");
      
      // Write to memory stream
      $msBuffer = fopen("php://memory","w+");
      foreach($arrData as $arrRecord)
      {
        fputcsv($msBuffer, $arrRecord);
      }
      
      // Rewind back to the beginning of the buffer and save the contents into a file in one big write
      rewind($msBuffer);
      fwrite($fpOut, stream_get_contents($msBuffer));
      
      // Close the memory stream
      fclose($msBuffer);
      
      // Close the output file
      fclose($fpOut);
      

      【讨论】:

      • stream_copy_to_stream() 可能会更好
      最近更新 更多