如何使用 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);
我必须在 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);