Perl CSV 读取不存在的字符



我正在使用Perl的Text::CSV_XS包读取一个文件,我正在Ubuntu上读取该包:

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文件?

您的文件不是有效的UTF-8文件。字节E9出现在不期望出现的地方。

后面跟着两个连续字节=正常

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

后面没有两个连续字节=错误

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

修复你的坏数据。

最新更新