Parsing CSV file into array
- snippets
- (Updated at )
記得數年前就有寫過匯入 CSV 資料的程式,不過要翻出來可以能重寫還快多了,本想說應該已有不少輪子在網路上,可惜找了一下還是找不到正確或是較有效率的處理方式,而 PEAR::File_CSV 也不明原因不存在,後來找到了一個簡單正確又有效率 Regular Expression 以此又重新寫了一個新 php function.
測試結果也另人滿意,在混搭的情形下也可以正確解析:
Test string: "Name","Nick Name","Age","Hair Color"
Array
(
[0] => Name
[1] => Nick Name
[2] => Age
[3] => Hair Color
)
Test string: 'Name','Nick Name','Age','Hair Color'
Array
(
[0] => Name
[1] => Nick Name
[2] => Age
[3] => Hair Color
)
Test string: "Name";"Nick Name";"Age";"Hair Color"
Array
(
[0] => Name
[1] => Nick Name
[2] => Age
[3] => Hair Color
)
Test string: Kim,"Kim ""Hot Legs"" Smith",24,"Brunette"
Array
(
[0] => Kim
[1] => Kim "Hot Legs" Smith
[2] => 24
[3] => Brunette
)
Test string: "Sarah Vivenz, II","Stub's",27,"Brunette"
Array
(
[0] => Sarah Vivenz, II
[1] => Stub's
[2] => 27
[3] => Brunette
)
php code:
/**
* parsing csv file into array
*
* @return array
* @author Ethan Liu
**/
function parser_csv($filepath, $header = '', $limited = 0) {
set_time_limit(0);
$result = array();
$x = 0;
$pattern = '/("(?:[^"]|"")*"|[^",\r\n]*)(,|;|\r\n?|\n|\r)?/';
$patterns = array(
'/^["\']|["\']$/',
'/("|\'){2}/'
);
$replacement = array(
"",
"$1"
);
if (!is_file($filepath)) {
return $result;
}
$f = @fopen($filepath, "r");
if (empty($f)) {
@fclose($f);
return $result;
}
switch ($header) {
case 'ignore':
$buffer = fgets($f);
break;
}
while (!feof($f)) {
if ($limited > 0) {
$x++;
if ($x > $limited) {
break;
}
}
$buffer = trim(fgets($f));
if (empty($buffer)) {
continue;
}
preg_match_all($pattern, $buffer, $matches);
$matches[1] = preg_replace($patterns, $replacement, $matches[1]);
if (empty($matches[1][count($matches[1])-1])) {
unset($matches[1][count($matches[1])-1]);
}
$result[] = $matches[1];
}
@fclose($f);
unset($buffer);
unset($matches);
return $result;
}