我需要从大型CSV文件中读取两列。 CSV有多列,有时可能具有以下属性:
在上面的示例CSV文件中,我只对“购买”和“销售”列(A列和D列)中的代码感兴趣。
我编写了以下代码(警告:它不是很优雅)迭代所有行并只读取我需要的列。我创建字符串作为1个大型MYSQL查询的输入(而不是运行许多小查询)。
<?php
//Increase the allowed execution time
set_time_limit(0);
ini_set('memory_limit','256M');
ini_set('max_execution_time', 0);
//Set to detect the ending of CSV files
ini_set('auto_detect_line_endings', true);
$file = "test.csv";
$buy = $sold = ""; //Initialize empty strings
if (($handle = @fopen($file, "r")) !== FALSE) {
while (($pieces = fgetcsv($handle, 100, ",")) !== FALSE) {
if ( ! empty($pieces[0]) ) {
$buy .= $pieces[0] ." ";
}
if ( ! empty($pieces[3]) ) {
$sold .= $pieces[3] ." ";
}
}
echo "Buy ". $buy ."<br>"; //Do something with strings...
echo "Sold ". $sold ."<br>";
//Close the file
fclose($handle);
}
&GT;
我的问题是:这是执行此类任务的最佳方式吗?该代码适用于较小的测试文件,但是我在这样迭代CSV文件时忽略了一些缺点吗?
答案 0 :(得分:1)
首先,如果将它们存储在变量中,读取任何大文件都会占用大量内存。您可以查看reading large files(more than 4GB in unix)
其次,您可以输出$ buy&amp; $出售 在while循环中,这两个变量未保存在内存中的方式可能更有效。
最后,在php fseek documentation
中使用文件搜索方法