我在R中有一个相当大的数据库(10,000多条记录,每条约120个变量)。问题是,原始.csv文件中大约一半的变量是以UTF-8正确编码的,而其余的则是编码的在ANSI(Windows-1252)中,但正在被解码为UTF-8,导致非ASCII字符(主要是拉丁语)的奇怪字符,如é
或ó
。
我不能简单地更改文件编码,因为它的一半会被错误的类型解码。此外,我无法知道哪些列是正确编码的,哪些列没有编码,而我所拥有的只是我尝试修复的原始.csv文件。
到目前为止,我发现纯文本文件可以用UTF-8编码,并且可以推断出错误解释的字符(坏的Unicode)。一个提供此类功能的库是ftfy用于Python。但是,我使用以下代码,到目前为止,还没有成功:
import ftfy
file = open("file.csv", "r", encoding = "UTF8")
content = file.read()
content = ftfy.fix_text(content)
但是,content
将显示与之前完全相同的文字。我相信这与ftfy推断内容编码的方式有关。
尽管如此,如果我运行ftfy.fix_text("Pública que cotiza en México")
,它将显示正确的回复:
>> 'Pública que cotiza en México'
我认为解决问题的方法可能是遍历.csv文件中的每个值(单元格)并尝试使用ftfy修复,并将文件导回R,但似乎有点复杂
有什么建议吗?
答案 0 :(得分:2)
事实上,在几个地方对随机单元格进行了混合编码。从其原始来源导出数据时可能存在问题。
ftfy的问题在于它逐行处理文件,如果它遇到格式良好的字符,它会假设整行都以相同的方式编码,而且意图是奇怪的字符。
由于这些错误在所有文件中随机出现,我无法转换整个表并处理每一行(列),因此答案是逐个单元地处理。幸运的是,Python有一个标准库,它提供了使用csv轻松工作的功能(特别是因为它正确地逃避了单元格)。
这是我用来处理文件的代码:
import csv
import ftfy
import sys
def main(argv):
# input file
csvfile = open(argv[1], "r", encoding = "UTF8")
reader = csv.DictReader(csvfile)
# output stream
outfile = open(argv[2], "w", encoding = "Windows-1252") # Windows doesn't like utf8
writer = csv.DictWriter(outfile, fieldnames = reader.fieldnames, lineterminator = "\n")
# clean values
writer.writeheader()
for row in reader:
for col in row:
row[col] = ftfy.fix_text(row[col])
writer.writerow(row)
# close files
csvfile.close()
outfile.close()
if __name__ == "__main__":
main(sys.argv)
然后,致电:
$ python fix_encoding.py data.csv out.csv
将输出具有正确编码的csv文件。
答案 1 :(得分:1)