3

我正在分析一组大型 (>150mb) 固定宽度数据文件。我一直在使用 read.fwf() 以 100 行块(每行是 7385 个字符)慢慢阅读它们,然后将它们推送到关系数据库中以进行进一步操作。问题是文本文件偶尔会有一个不稳定的多字节字符(例如,通常足以令人讨厌,而不是“U”,数据文件具有系统分配给 Unicode U+F8FF 的任何内容。在 OS X 中,这是一个苹果符号,但不确定这是否是跨平台标准)。发生这种情况时,我会收到如下错误:

'NTY <20> MAINE
000008 [...]处的无效多字节字符串

那应该是“县”这个词的后半部分,但如上所述,U 是不稳定的。(如果有人认为它们有用,很乐意提供更详细的代码和数据。)

我想在 R 中完成所有编码,但我不确定如何强制使用单字节。因此,我的问题的主题行部分:是否有一些简单的方法可以从包含一些错误多字节字符的文本文件中强制转换单字节 ascii?

或者也许有更好的方法来处理这个问题(我应该在系统级别从 R 调用 grep 来找出错误的多字节字符)?

非常感谢任何帮助!

4

1 回答 1

2

该命令的输出file对您的数据文件有什么影响?

/tmp >file a.txt b.txt 
a.txt: UTF-8 Unicode text, with LF, NEL line terminators
b.txt: ASCII text, with LF, NEL line terminators

您可以尝试使用iconv. 例如,给定一个使用Windows 1252 编码的文件:

# \x{93} and \x{94} are Windows 1252 quotes
/tmp >perl -E'say "He said, \x{93}hello!\x{94}"' > a.txt 
/tmp >file a.txt
a.txt: Non-ISO extended-ASCII text
/tmp >cat a.txt 
He said, ?hello!?

现在,您可以使用 iconv尝试将其转换为 ascii:

/tmp >iconv -f windows-1252 -t ascii a.txt 
He said, 
iconv: a.txt:1:9: cannot convert

由于这里没有直接转换,所以它失败了。相反,您可以告诉iconv进行音译:

/tmp >iconv -f windows-1252 -t ascii//TRANSLIT a.txt  > converted.txt
/tmp >file converted.txt
converted.txt: ASCII text
/tmp >cat converted.txt 
He said, "hello!"

可能有一种方法可以使用 R 的 IO 层来做到这一点,但我不知道 R。

希望有帮助。

于 2013-08-15T05:13:41.603 回答