我刚写了一个php函数,它将从csv文件中读取数据并将数据存储到一个数组中,每个行数据都作为一个元素。每个元素都是一个由csv头键控的关联数组。
该功能如下所示:
function parse_csv($csv_path) {
if(is_file($csv_path)&&file_exists($csv_path)) {
$csv_data = array();
$csv_header = array();
$n = 0;
try {
$csv_file = fopen($csv_path, "r");
while (!feof($csv_file)) {
$csv_line = fgetcsv($csv_file);
if(array(NULL) !== $csv_line && !empty($csv_line)) {
$n++;
if($n == 1) {
$csv_header = $csv_line;
}
else {
$csv_row = array();
for($i=0;$i<count($csv_header);$i++) {
$csv_row[$csv_header[$i]] = $csv_line[$i];
}
$csv_data[] = $csv_row;
}
}
}
return $csv_data;
}
catch (Exception $e) {
return FALSE;
}
}
else {
return FALSE;
}
}
我已经完成了一项测试,并使用print_r来打印由该函数设计的数组,如下所示:
$csv = parse_csv('D:\countries.csv');
print_r($csv);
输出结果为:
Array
(
[0] => Array
(
[TermName] => Afghanistan
[TermDescription] =>
[TermFormat] =>
)
[1] => Array
(
[TermName] => Albania
[TermDescription] =>
[TermFormat] =>
)
[2] => Array
(
[TermName] => Algeria
[TermDescription] =>
[TermFormat] =>
)
[3] => Array
(
[TermName] => American Samoa
[TermDescription] =>
[TermFormat] =>
)
[4] => Array
(
[TermName] => Andorra
[TermDescription] =>
[TermFormat] =>
)
)
但是当我试图像这样访问单个元素时
print($csv[1]["TermName"]);
我收到了错误:未定义的索引:第49行的C:\ xampp \ htdocs \ test \ test.php中的TermName。
这让我很困惑。我错过了什么吗?
找到原因:
因为我用Windows记事本保存了csv文件,所以它将BOM添加到文件中。因此第一个标题变为[BOM] TermName。删除BOM后,现在一切都很好。
答案 0 :(得分:0)
您可以缩短代码并使其更具可读性,以便更快地找到错误。
function parse_csv($csv_path) {
if(is_file($csv_path) && file_exists($csv_path)) {
$stream = fopen($csv_path, 'r');
$csvHeader = fgetcsv($stream);
$csvData = [];
while(!feof($stream))
{
$lineData = [];
$line = fgetcsv($stream);
if( count($csvHeader) != count($line) )
{
throw new \Exception('Line '.count($csvData)+1.' got more data then headers!');
}
foreach($csvHeader as $x => $header)
{
$lineData[$header] = $line[$x];
}
$csvData[] = $lineData;
}
return $csvData;
}
return false;
}