我有一个包含40000行的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";
?>
因此,要从40000行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;
}
最初不需要将所有行加载到一个数组中。只需在开始时构建"已筛选"数组。
$field_delimiter = ","; // or "|" or any other delimiter
function parse($file_in) {
$fh = fopen($file_in, "r");
$data_arr = array();
while (($line = fgetcsv($fh, 1024, $field_delimiter)) !== false) {
//add data into your array in here;
//anytime you want to skip a line of data, just use: continue;
}
return $data_arr;
}