gpt4 book ai didi

PHP 无法正确解析 CSV(文件为 UTF-16LE)

转载 作者:行者123 更新时间:2023-12-05 01:42:04 25 4
gpt4 key购买 nike

我正在尝试使用 PHP 解析 CSV 文件。
该文件使用逗号作为分隔符,并为包含逗号的字段使用双引号,如:

foo,"bar, baz",foo2

问题 我面临的是我得到的字段包含逗号分隔。我得到:

  • "2
  • rue du ..."

代替:2, rue du ...


编码:
该文件似乎不是 UTF8 格式。它的开头有奇怪的字符( apparently not BOM ,从 ASCII 转换为 UTF8 时看起来像这样:ÿþ)并且不显示重音符号。

  • 我的代码编辑器 (Atom) 告诉我编码是 UTF-16 LE
  • 使用mb_detect_encoding()在 csv 行上它返回 ASCII

但它无法转换:

  • mb_convert_encoding()ASCII 转换,但从 UTF-16LE
  • 返回亚洲字符
  • iconv()返回 注意:iconv():错误的字符集,不允许从 UTF-16LE/ASCII 转换为 UTF8 .

解析:
我尝试使用 str_getcsv() 来解析这个单行代码(请参阅 those 2 comments):

$csv = array_map('str_getcsv', file($file['tmp_name']));

然后我尝试使用 fgetcsv() :

$f = fopen($file['tmp_name'], 'r');
while (($l = fgetcsv($f)) !== false) {
$arr[] = $l;
}
$f = fclose($f);

在这两种方式中,我都将地址字段分为两部分。但是当我尝试这个代码示例时,我得到了正确解析的字段:

$str = 'foo,"bar, baz",foo2,azerty,"ban, bal",doe';
$data = str_getcsv($str);
echo '<pre>' . print_r($data, true) . '</pre>';

用问题来总结:

  • 文件开头的字符是什么?
  • 我如何确定编码? (Atom 以UTF-16 LE 读取文件,开头不显示怪异字符)
  • 是什么导致 csv 解析函数失败?
  • 如果我应该依靠其他东西来解析 CSV 的行,我可以使用什么?

最佳答案

我终于自己解决了:

我将文件发送到返回 UTF16LE 的在线编码检测网站。在检查什么是 UTF16LE 后,它说它有 BOM(字节顺序标记)
我之前的尝试是使用 file() 返回文件的行数组fopen() 返回一个资源,但我们仍然逐行解析

我想到的工作解决方案是转换整个文件(一次转换每一行),而不是分别转换每一行。这是一个可行的解决方案:

$f = file_get_contents($file['tmp_name']);          // Get the whole file as string
$f = mb_convert_encoding($f, 'UTF8', 'UTF-16LE'); // Convert the file to UTF8
$f = preg_split("/\R/", $f); // Split it by line breaks
$f = array_map('str_getcsv', $f); // Parse lines as CSV data

我不再使用内部逗号分隔地址字段。

关于PHP 无法正确解析 CSV(文件为 UTF-16LE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52579979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com