【发布时间】:2020-02-27 02:28:28
【问题描述】:
str_getcsv () 有一些奇怪的行为。它会删除与封闭字符匹配的所有字符,而不是只删除封闭字符。我正在尝试分两步解析 CSV 字符串(上传文件的内容):
- 将 CSV 字符串拆分为行数组
- 将每一行拆分为一个字段数组
使用此代码:
$whole_file_string = file_get_contents($file);
$array_of_lines = str_getcsv ($whole_file_string, "\n", "\""); // step 1. split csv into lines
foreach ($array_of_lines as $one_line_string) {
$splitted_line = str_getcsv ($one_line_string, ",", "\""); // step 2. split line into fields
};
为了清晰起见,在代码示例中,$splitted_line 没有做任何事情
然后我为这个脚本提供一个包含以下内容的文件:"text,with,delimiter",secondfield。
当执行第 1 步时,$array_of_lines 的第一个(也是唯一的)元素是 text,with,delimiter,secondfield。因此,当执行第 2 步时,它会将行拆分为 4 个字段,但需要为 2。
我不能使用fgetcsv(),因为在读取文件之后并在步骤 1 中将其拆分为行之前,已经完成了一些字符串转换(检查 BOM、相应地转换编码等)。
我正在编写自己的字符串解析器(这对于 CSV 格式来说并不复杂),但在我这样做之前,我想确保这是最好的方法。我有点失望,PHP 函数让我对这个简单(我猜很常见)的用例感到失望:处理上传的具有不同编码的 csv 文件。
有什么建议吗?
【问题讨论】: