我有一个包含40 000行的CSV文件,我将所有行加载到数组中,并且使用此函数返回仅具有我需要的值的子数组...这是代码
<?php
//----------------------------------------------
function query_array($theArray,$theQuery,$col){
$return = array();
foreach($theArray as $subarray){
if ($subarray[$col] == $theQuery) {
$return[] = $subarray;
}
}
return $return;
}
//----------------------------------------------
function parse_csv_file($csvfile) {
$csvData = file_get_contents($csvfile);
$lines = explode("\n", $csvData);
$array = array();
foreach ($lines as $line) {
$array[] = str_getcsv($line);
}
return $array;
}
//----------------------------------------------
function echo_array($theArray) {
$return = "";
foreach ($theArray as $key => $value) {
$result = implode(' ', $value);
$return .= '(# '. $key .')-> '. $result .'<br/>';
}
return $return;
}
//----------------------------------------------
$starttime = microtime(TRUE);
$fileName = "the-path-to-my-file/PHOTOS.TXT";
$basename = basename($fileName);
$MyQuery = "8370336";
$myCol = 0;
echo 'Query : Find : '. $MyQuery . ' dans la collone : '. $myCol . ' du fichier : '. $basename .'<br/><br/>';
$outputArray = parse_csv_file($fileName);
$slimDownArray = query_array($outputArray, $MyQuery, $myCol);
echo echo_array($slimDownArray);
$endtime = microtime(TRUE);
$totaltime = $endtime - $starttime;
echo '<br/>Temp execution : '. round($totaltime,2) . ' second<br/>'."\n";
?>
因此,要从40 000行csv中获得23个条目,需要1.7秒...问题是,我们可以使其更快吗?不到1秒?
对象或类方法将更好/更灵活,但这种方法应该比您拥有的方法快。我只是将常量用于几件事。$line
只有在您关心行号的情况下,这些东西才存在:
function query_csv($query, $col) {
static $fp;
if(!$fp) {
$fp = fopen(CSV_NAME, 'r');
}
$line = 0;
$return = array();
while(($data = fgetcsv($fp, 0, CSV_DELIM, CSV_ENC)) !== false) {
if($data[$col] == $query) {
//$return[$line] = $data; //if you want array keyed by line
$return[] = $data;
}
$line++;
}
return $return;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句