我有一个很大的.txt文件(73000行),我需要将该文件中的数据存储在一个数组中。
下面是一个文件外观的例子,它只是以这种方式重复,每一行都是这样的。
2016-05-27 11:04:16: QParRFSum=1574.00 QParRFSumMean=6.05 QParSuspSum=83.00
2016-05-27 11:14:07: QParRFSum=1537.00 QParRFSumMean=5.91 QParSuspSum=96.00
2016-05-27 11:14:07: QParRFSum=1537.00 QParRFSumMean=5.91 QParSuspSum=96.00
2016-05-27 11:24:07: QParRFSum=1405.00 QParRFSumMean=5.40 QParSuspSum=0.00
2016-05-27 11:24:07: QParRFSum=1405.00 QParRFSumMean=5.40 QParSuspSum=0.00
2016-05-27 11:34:06: QParRFSum=1533.00 QParRFSumMean=5.90 QParSuspSum=89.00
2016-05-27 11:34:06: QParRFSum=1533.00 QParRFSumMean=5.90 QParSuspSum=89.00
我想把这个放进一个数组,里面有这样的键:
Array (
[0] =>
(
[date] => 2016-05-27
[time] => 11:04:16
[QParRFSum] => 1574.00
[QParRFSumMean] => 6.05
[QParSuspSum] => 83.00
)
[1] =>
(
[date] => 2016-05-27
[time] => 11:14:07
[QParRFSum] => 1537.00
[QParRFSumMean] => 5.91
[QParSuspSum] => 96.00
)
[2] =>
(
[date] => 2016-05-27
[time] => 11:14:07
[QParRFSum] => 1537.00
[QParRFSumMean] => 5.91
[QParSuspSum] => 96.00
)
)
And so on...
考虑到性能,我该如何以最好的方式做到这一点?
我的想法是用file()函数和foreach循环逐行遍历它。然后以某种方式将其处理成我想要的数组结构。类似这样的东西:
$txt=file('path/to/file');
foreach($txt as $line)
{
$RFAValues[] = $line;
}
这是一条路吗,还是有更好的路能给我更好的表现?
我用内存写,但使用了类似的东西
$file = file_get_contents('file.txt');
$list = explode(PHP_EOL, $file);
$_temp = [];
foreach ( $list as $row )
{
$_explode = explode(' ', $row);
$_temp[] = [
'date' => $_explode[0],
'time' => rtrim($_explode[1], ':'),
'QParRFSum' => $_explode[2],
'QParRFSumMean' => $_explode[3],
'QParSuspSum' => $_explode[4]
];
}
var_dump( $_temp );
就我个人而言,如果您正在处理巨大的文件,我会使用generators
和file streams
的组合。因此,您有了流,并使用生成器按需将其转换为数组,这样就不会耗尽内存。也许像这个
function readFromFile($fileName) {
$handle = @fopen("/tmp/inputfile.txt", "r");
while (($line = fgets($handle, 4096)) !== false) {
//Process Line
yield $line;
}
fclose($handle);
}