从文本文件强制单字节ascii

时间:2013-08-15 01:44:37

标签: r unicode ascii iconv fixed-width

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

  

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

那应该是“郡”这个词的后半部分,但如上所述,U是不可思议的。 (很高兴提供更详细的代码和数据,如果有人认为它们会有用。)

我想在R中进行所有编码,我只是不确定如何强制单字节。因此,我的问题的主题部分:是否有一些简单的方法来强制从其中包含一些错误的多字节字符的文本文件中强制单字节ascii?

或许还有更好的方法可以解决这个问题(我应该从系统级别调用grep来搜索错误的多字节字符)吗?

任何帮助非常感谢!

1 个答案:

答案 0 :(得分: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转换/音译文件的内容。例如,给定使用the Windows 1252 encoding的文件:

# \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。

希望有所帮助。