如何使用 PHP 一次尝试将多个 Rows/Arrays 写入 CSV 文件?

How to Write Multiple Rows/Arrays to CSV File in one attempt using PHP?

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

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

请帮忙。

如果你担心做多次写入操作,你可以"write"将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);

解决方案 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);

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

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