我有以下问题。我有一个包含更多10万条记录的tabdelimited文件。在每一行都有6个或更多的元素,但我想从任何一行获得2个元素。
tabdelemited文件的示例结构:
a1 1 b1 c1 11 111
a2 2 b2 c2 12 112
a3 3 b3 c3 13 113
a4 4 b4 c4 14 114
...........................................................................
以下代码从数组中返回此文件中的所有元素:
$f4 = fopen("FILE.TXT", 'r');
while (($line = fgetcsv($f4, 0, "\t")) !== FALSE)
if ($line)
$arr4[] = $line;
fclose($f4);
这行代码超过10万行的速度非常慢。我怎样才能获得他们需要的元素和快速的算法?
输出结果:
Array
(
[0] => Array
(
[0] => a1 //first column
[1] => b1 //third column
)
[1] => Array
(
[0] => a2
[1] => b2
)
[2] => Array
(
[0] => a3
[1] => b3
)
[3] => Array
(
[0] => a4
[1] => b4
)
)
提前致谢。
答案 0 :(得分:1)
如果我正确理解了您的问题,您希望从CSV文件中的每一行中检索2个任意数量的列。要做到这一点:
$f4 = fopen('FILE.TXT', 'r');
while (($line = fgetcsv($f4, 0, "\t")) !== FALSE) {
$arr4[] = array(
$line[2], // Use whatever indexes you need for the columns
$line[3] // here.
);
}
fclose($f4);
或者,您可以指定最大长度作为参数#2到fgetcsv()
以加快速度。有关详细信息,请参阅here。
编辑:此外,如果您的列索引是连续的(例如2,3或4,5),使用array_slice()可能会更快,但您必须将其基准测试知道肯定。
答案 1 :(得分:1)
每行2列
如果你的目标是从每一行获得2列,那么你将不得不迭代所有行。最好立即执行所需的任何操作,而不是将行放入数组中(因为如果多个用户可以同时访问此脚本,它会快速占用内存)。
提高速度的唯一方法是提前缓存结果。例如,您可以将CSV加载到数据库表中并为列编制索引。
与ID匹配的行中的2列
通过执行正则表达式搜索,您可以相当快地完成此操作,而不是解析整个文件。例如,如果您将ID放入第一列,则可以执行以下操作:
// note that because we use file_get_contents, the file must fit in memory!
// if multiple users are hitting this at the same time, it could be a valid concern
preg_match("/^$sanitized_id/" file_get_contents('filename.csv'), $matches);
if( count($matches) > 1 ) {
$row_values = explode("\t", $matches[1]);
var_dump($row_values);
}
else {
print "No matches";
}
或者,如果您可以提前访问该文件,则可以执行与上述相同的操作,并将结果索引到数据库表中,从而快速轻松地进行搜索。