代码之家  ›  专栏  ›  技术社区  ›  AymDev

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

  •  1
  • AymDev  · 技术社区  · 7 年前

    我试图用PHP解析CSV文件。
    文件使用 逗号分隔符 ,作为:

    foo,"bar, baz",foo2
    

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

    • "2
    • rue du ..."

    而不是: 2, rue du ... .


    编码:
    apparently not BOM ,从ASCII转换为UTF8时如下所示: ÿþ )不会显示口音。


    解析:
    我试图用这一行代码进行解析(参见 those 2 comments )使用 str_getcsv()

    $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>';
    

    总结问题:

    • 我怎么能确定编码呢? UTF-16 LE 一开始不会出现奇怪的字符)
    • 如果我应该依赖其他东西来解析CSV的行,我可以使用什么?
    1 回复  |  直到 7 年前
        1
  •  5
  •   AymDev    7 年前

    我终于自己解决了:

    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