如何从PHP中使用最大的制表符分隔文件获取有用信息?

时间:2012-02-01 17:55:38

标签: php arrays algorithm csv tab-delimited

我有以下问题。我有一个包含更多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   
        )
)

提前致谢。

2 个答案:

答案 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";
}

或者,如果您可以提前访问该文件,则可以执行与上述相同的操作,并将结果索引到数据库表中,从而快速轻松地进行搜索。