2016-05-16 7 views
1

Rの中にかなり大きなデータベース(それぞれ約120バースのレコードが10,000以上あります)があります。元の.csvファイルの変数の約半分がUTF-8で正しくエンコードされています残りはANSI(Windows-1252)でエンコードされていましたが、UTF-8としてデコードされているため、éóのようなASCII以外の文字(主にラテン語)の場合は奇妙な文字になります。csvファイルでの混合エンコード

半分が間違ったタイプでデコードされるため、ファイルのエンコーディングを変更することはできません。さらに、どの列が正しくエンコードされ、どの列がエンコードされていないかを知る方法がなく、私が修正しようとしているオリジナルの.csvファイルがあります。

これまでのところ、プレーンテキストファイルはUTF-8でエンコードでき、誤った解釈の文字(悪いUnicode)が推測できることが分かりました。このような機能を提供するライブラリの1つは、Pythonの場合はftfyです。

import ftfy 

file = open("file.csv", "r", encoding = "UTF8") 
content = file.read() 

content = ftfy.fix_text(content) 

しかし、contentが以前よりも正確に同じテキストを表示します。しかし、私は次のコードとこれまでのところ、持っていなかったの成功を使用しています。私はこれが、ftfyがコンテンツのエンコーディングを推論する方法と関係があると考えています。私は多分問題を解決する方法をのことを考えている

>> 'Pública que cotiza en México' 

の値(セル)のそれぞれを反復処理することです:私はftfy.fix_text("Pública que cotiza en México")を実行する場合

にもかかわらず、それは正しい応答が表示されます。 csvファイルを修正してftfyで修正しようとすると、ファイルをRにインポートすると少し複雑になりますが、少し複雑に見えますが

何か提案がありますか?

+1

ファイルが混在していて、UTF-8を使用している場合は、UnicodeDecodeエラーが発生します。文字がDBに間違って格納されているように聞こえます。提案されているようにftfyを使用してください。おそらく結果を返す前にftfyを解析するためにCSVモジュールのラッパーを書いてください。 –

答えて

2

実際には、場所。おそらく、元のソースからデータをエクスポートするときに問題が発生していた可能性があります。

ftfyの問題は、ファイルを1行ずつ処理することです。整形された文字が見つかった場合は、行全体が同じ方法でエンコードされており、奇妙な文字が意図されているとみなされます。

これらのエラーはすべてのファイルでランダムに表示されていたため、テーブル全体を転置してすべての行(列)を処理することができなかったため、答えはセル単位で処理されていました。幸運なことに、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ファイル

この

は、私は、ファイルを処理するために使用されるコードです。

+0

良い解決策。ヘッダー、辞書などを扱う必要がないので、csv.readerとcsv.writerを使用する方が簡単だとわかりましたが – AlexanderMP

1

小さな提案:分裂と征服。 1つのツール(ftfy?)を使用して、すべてのファイルを同じエンコードに整列させて(プレーンテキストファイルとして保存して)、csvとして解析してみてください。

関連する問題