r-从文本文件中强制使用单字节ascii



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

在'NTY<20> MAINE
000008[…]

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

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

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

非常感谢您的帮助!

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的

希望能有所帮助。

最新更新