csv - 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 行没有看到任何这样的字符,该行看起来就像任何其他行一样。
我尝试将开放线更改为
打开我的 $fh, '<', 'file.csv'
但这给出了同样的错误。
我尝试打开 CSV 并使用不同的分隔符另存为 CSV,但我不能再在 Excel 2016 中执行此操作,更改分隔符的选项根本不会出现
我尝试在 LibreOffice 中打开以另存为 CSV,但更新删除了更改分隔符的功能
如何在没有这个奇怪错误的情况下读取这个 CSV 文件?
解决方案
您的文件不是有效的 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
修复您的不良数据。
推荐阅读
- web - 数据清除交互式地图 - Cal Fire 相关
- java - 在java中转换美国距离测量和公制的程序
- java - 尝试在 JWindow 内使用绘画,但没有显示
- c# - Unity 2018 - UI 文本元素 - 拾取时不更新计数
- vue.js - Vue.js 组件表单发送空值
- android - 在 GridView 中交换元素
- firebase - Firebase - 单击按钮时在云功能中运行“functions.https”
- css - 覆盖 Glyphicon 样式
- node.js - AWS Lambda 转码器返回失真的音频
- sql-server - 如何使用 cte 重写 while 循环