首页 > 解决方案 > Perl CSV 读取不存在的字符

问题描述

我正在使用Text::CSV_XS我在 Ubuntu 上阅读的 Perl 包读取文件:

open my $fh, '<:encoding(utf8)', 'file.csv' or die "Can't read csv: $!"; # error shows on this line
while (my $row = $list->getline ($fh)) {
....
}

这读起来很好,直到一行出现错误:

UTF-8 "\xE9" does not map to Unicode at 0.xlsx_to_json.pl line 198, <$_[...]> line 14019.

在网上看,这表明这是一个 ê 字符或类似的东西,这很奇怪,因为我在第 14109 行没有看到任何这样的字符,该行看起来就像任何其他行一样。

  1. 我尝试将开放线更改为

    打开我的 $fh, '<', 'file.csv'

但这给出了同样的错误。

  1. 我尝试打开 CSV 并使用不同的分隔符另存为 CSV,但我不能再在 Excel 2016 中执行此操作,更改分隔符的选项根本不会出现

  2. 我尝试在 LibreOffice 中打开以另存为 CSV,但更新删除了更改分隔符的功能

如何在没有这个奇怪错误的情况下读取这个 CSV 文件?

标签: csvperlutf-8

解决方案


您的文件不是有效的 UTF-8 文件。字节 E9 出现在预期之外的位置。

后跟两个连续字节 = ok

$ perl -M5.010 -MEncode=decode -e'
   decode("UTF-8", "\xE9\xBF\xBF", Encode::FB_WARN | Encode::LEAVE_SRC);
   say "done";
'
done

后面没有两个连续字节 = 坏

$ perl -M5.010 -MEncode=decode -e'
   decode("UTF-8", "\xE9\x41", Encode::FB_WARN | Encode::LEAVE_SRC);
   say "done";
'
UTF-8 "\xE9" does not map to Unicode at -e line 2.
done

修复您的不良数据。


推荐阅读