我有大量一维数组存储在内存缓存中,我想将它们写入CSV文件,这些数组通过使用队列一个接一个地来。但我想"将每个csv文件限制在大约100行",然后将剩余的数组写入较新的文件中,以此类推。我将非常感谢在这方面的任何帮助。我使用这个函数将数组传递到csv中,但我不知道如何将行数限制为100,然后打开新文件并写入它们。队列中传递的消息是名为SO1、SO2、SO3的密钥,依此类推,最后一条消息传递为"last"。基于密钥,与密钥相关联的数组从memcache中读取,并且必须写入csv文件。消息通过rabitmq-队列从前面的模块一个接一个地到达。//假设$S01是基于通过队列接收的密钥(比如S01)从memcache提取的数组。$SO1=数组("姓名"=>"优步"、"年龄"=>"24"、"性别"=>"男性"、"解锁"=>"是"、"总计"=>"1000");
$row_count= 0;
$csv_file_count= 1;
while($msg != "LAST" ){ // As long as msg recieved is not LAST
$csv = fopen("file_". $csv_file_count.".csv", "w");
fputcsv($csv, array_keys($SO));
while($msg != "LAST" && $row_count<100){
fputcsv($csv, $SO); // Write toCSV
$row_count++;
}
$row_count=0;
$csv_file_count++;
fclose($csv);
您可以制作这样的计数器。
$row_count = 0;
$csv_file_count = 1;
while (!$q->isEmpty()){ // as long as the queue is not empty
$csv = fopen("file_".$csv_file_count.".csv", "w"); // open "file_n.csv" n file number
fputcsv($csv,explode(',',"col1,col2,col3,col4")); // Your custom headers
while (!$q->isEmpty() && $row_count < 100){ // so while queue is not empty and the counter didnt reach 100
fputcsv($csv, explode(',',$q->pop())); // write to file. Explode by , or space or whatever your data looks like
$row_count++; // increment row counter
}
$row_count = 0; // when that is not true anymore, reset row counter
$csv_file_count++; // increment file counter
$csv.close() // close file
} // repeats untill queue is empty
更新为使用fputcsv()
如果你想在csv文件中使用另一个分隔符,你可以这样做:
fputcsv($csv, explode(',',explode(',',$q->pop()),";"); // (;) for example. Default is comma (,)
您也可以指定一个现场机柜
fputcsv($csv, explode(',',explode(',',$q->pop()),",","'"); // (') for example. Default is double quote (")
fputcsv()获取2个必需参数和2个可选
来自php.net fputcsv
int fputcsv ( resource $handle , array $fields [, string $delimiter = "," [, string $enclosure = '"' [, string $escape_char = "'" ]]] )
字段应该是一个数组,因此
爆炸(',',$q->pop())作为第二个参数