有几种方法可以用PHP读取CSV文件。我曾经使用 explosion 函数将每行放入数组中,然后使用 explosion 逗号,并使用trim从数据周围删除任何引号。这是混乱的…
在PHP 5中现在有fgetcsv和*str_getcsv*…我猜这是目前最好的方法,所以我拼凑了一些代码…
$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…
你能给的任何输入都会很棒!
有一个逐行读取文件的函数:file()
,它也适用于两种换行类型。
在整个CSV文件中最短的读取方法是:
$data = array_map("str_getcsv", file($filename));
不知道你的$num = count()
是关于什么的
这将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;
}