使用PHP读取CSV文件有几种方法。我曾经使用 explode 函数将每一行放入一个数组,然后爆炸逗号并使用 trim 删除周围的任何引号数据。这太乱了......
在PHP 5中,现在有了 fgetcsv 和* str_getcsv * ......我猜这是最好的方法,所以我把一些代码鞭打在一起...... < / p>
$fp = fopen($csv_file['file_path'], 'r');
while (($data = fgetcsv($fp, 0, "\r", '"', "\r")) !== FALSE) {
$num = count($data);
for ($c=0; $c < $num; $c++) {
print_r(str_getcsv($data[$c]));
}
}
它似乎有用,但是有更多的失败安全方法吗?例如,无论换行是\ n还是\ r ...
,它都能正常工作您可以提供任何输入都很棒!
答案 0 :(得分:6)
有一个按行阅读文件的功能:file()
,它也适用于两种换行类型。
读取整个CSV文件的最短方法是:
$data = array_map("str_getcsv", file($filename));
不确定$num = count()
的内容。
答案 1 :(得分:2)
这会将CSV转换为嵌套数组。你可能更容易处理:
<?php
/**
*
*/
function csv_entry_to_array(array $row)
{
$column_count = count($row);
$csv_column_values = array();
// Loop through the columns of the current CSV entry and store its value
for ($column_index = 0; $column_index < $column_count; $column_index++)
{
// Store the value of the current CSV entry
$csv_column_values[] = $row[$column_index];
}
// Return
return $csv_column_values;
}
/**
* @param string $input_file_name Filename of input CSV
* @param boolean $include_header_in_output Flag indicating whether the first entry in the CSV is included in the output or not.
* @param integer $length Must be greater than the longest line (in characters) to be found in the CSV file (allowing for trailing line-end characters).
* It became optional in PHP 5. Omitting this parameter (or setting it to 0 in PHP 5.0.4 and later) the maximum line length is
* not limited, which is slightly slower.
* @param string $delimeter Set the field delimiter (one character only).
* @param string $enclosure Set the field enclosure character (one character only).
* @param string $escape Set the escape character (one character only). Defaults as a backslash.
* $return array Nested indexed array representing the CSV. Empty array on error (e.g. input file missing, input file not a CSV).
*/
function csv_file_to_array($input_file_name, $include_header_in_output = TRUE, $length = 1000, $delimeter = ',', $enclosure = '"', $escape = '\\')
{
// NOTE: this attempts to properly recognize line endings when reading files from Mac; has small performance penalty
ini_set('auto_detect_line_endings', TRUE);
$csv_array = array();
// Warnings are supressed, but that's OK since the code handles such warnings
if (($handle = @fopen($input_file_name, "r")) !== FALSE)
{
$row_counter = 0;
// Iterate over the CSV entries
while (($row = fgetcsv($handle, $length, $delimeter, $enclosure, $escape)) !== FALSE)
{
if ($row_counter === 0 && $include_header_in_output === TRUE)
{
// This is the first row in the CSV and it should be included in the output
$csv_array[] = csv_entry_to_array($row);
}
else if ($row_counter > 0)
{
// This is a row in the CSV that needs to be stored in the return array
$csv_array[] = csv_entry_to_array($row);
}
$row_counter++;
}
// Close file handler
fclose($handle);
}
else
{
// Input file: some error occured
return array();
}
return $csv_array;
}