2017-02-27 3 views
0

私はいくつかのcsvファイルを持っていますが、それぞれに異なるフォーマットがあります。ここには2つの異なるcsvファイルのサンプルがあります。値ではない形式を見てください。Pythonで2つの異なるタイプのcsvフォーマットを解析する

csv_2 "xxxx-0147-xxxx-194443,""Jan 1, 2017"",7:43:43 AM PST,,Google fee,,Smart Plan (Calling & Texting),com.yuilop,1,unlimited_usca_tariff_and,mimir,US,TX,76501,USD,-3.00,0.950210,EUR,-2.85" 
csv_2 "1305-xxxx-0118-54476..1,""Jan 1, 2017"",7:17:31 AM PST,,Google fee,,Smart Plan (Calling & Texting),com.yuilop,1,unlimited_usca_tariff_and,htc_a13wlpp,US,TX,79079,USD,-3.00,0.950210,EUR,-2.85" 
csv_1 GPA.xxxx-2612-xxxx-44448..0,2017-02-01,1485950845,Charged,m1,Freedom Plan (alling & Texting),com.yuilop,subscription,basic_usca_tariff_and,USD,2.99,0.00,2.99,,,07605,US 
csv:1 GPA.xxxx-6099-9725-56125,2017-02-01,1485952917,Charged,athene_f,Buy 100 credits (Calling & Texting),com.yuilop,inapp,100_credits,INR,138.41,0.00,138.41,Kolkata,West Bengal,700007,IN 

uはcsv_2が含まれている」と、時には 『』、しかし。私はオンデマンドですべてのCSVを簡単なフォーマット取得し、彼らはたくさんと巨大であるさcsv_1見ての通り。私は認識するためにスニファを使用しようとしました方言は自動的に。しかし、これは十分ではないと私は「」を持っているいずれかの合理的な回答を得ることはありません。この問題を解決する方法を私にguidをすることができます誰もがありますか?

Pythonコード2.7

With open(file, 'rU') as csvfile: 
    dialect = csv.Sniffer().sniff(csvfile.read(2024)) 
    csvfile.seek(0) 
    reader = csv.reader(csvfile, dialect) 
    for line in reader: 
     print line 

パラメータ値:csv_2で

dialect.escapechar  None 
dialect.quotechar  " 
dialect.quoting  0 
dialect.escapechar  None 
dialect.delimiter  , 
dialect.doublequote False 

結果

csv_1 ['GPA.13xx-xxxx-9725-5xxx', '2017-02-01', '1485952917', 'Charged', 'athene_f', 'Buy 100 credits (Calling & Texting)', 'com.yuilop', 'inapp', '100_credits', 'INR', '138.41', '0.00', '138.41', 'Kolkata', 'West Bengal', '700007', 'IN'] 
csv_2 ['1330-xxxx-5560-xxxx,"Jan 1', ' 2017""', '12:35:13 AM PST', '', 'Google fee', '', 'Smart Plan (Calling & Texting)', 'com.yuilop', '1', 'unlimited_usca_tariff_and', 'astar-y3', 'US', 'NC', '27288', 'USD', '-3.00', '0.950210', 'EUR', '-2.85"'] 

、あなたは混乱を参照してください。日付はコンマの特別な日付フィールドで区切られ、すべての行も文字列とみなされます。 csv_1と同じ結果を得るためにコードを変更するにはどうすればよいですか?

ないプリプロセスのcsvがきれい」と、それを正規化した後、他のCSVなどのデータをロードするのはなぜ

答えて

0

+1

それぞれのCSV形式がわからないという問題があります。約1000のCSVファイルがあるので、それぞれの時間を費やしている作業を開くと、そのための提案はありますか? –

+0

あなたはすべてのcsvファイルを解析した後に、その情報を処理する必要があるのに、1000個のcsvファイルがいくつあるかを知る必要があります。 –

+0

あなたはすぐにすべてのファイルを受け取るわけではないので、私は次に何が来るのか分かりません。私はあなたが例外を持っているようなものを意味し、別のcsv形式を見つけて、別々に行動します。私はスニファがこの仕事を自動的に行うことができますが、この部分を気にする必要はありません。@ Antonio Beamud –

0

あなたは働いコードから一歩だ。あなたがするんだすべては最初replaceですcsvfile" sが、その後、あなたの現在のアプローチはうまく動作します

EDIT:あなたはCSVファイルに読み込んだ後に分離された日付文字列をマージするに興味がある場合は、あなたの最善の策は、正規表現であります私はオリジナルの答えにいくつかのコードを含めました。編集したRegexコードの大部分をthis older answerからコピーしました。

import re 
import csv 

with open(file, 'rU') as csvfile: 
    data = csvfile.read(2024) 
    # Remove the pesky double-quotes 
    no_quotes_data = data.replace('"', '') 

    dialect = csv.Sniffer().sniff(no_quotes_data); 

    csv_data = csv.reader(no_quotes_data.splitlines(), dialect) 

    pattern = r'(?i)(%s) +(%s)' 

    thirties = pattern % (
     "Sep|Apr|Jun|Nov", 
     r'[1-9]|[12]\d|30') 

    thirtyones = pattern % (
     "Jan|Mar|May|Jul|Aug|Oct|Dec", 
     r'[1-9]|[12]\d|3[01]') 

    feb = r'(Feb) +(?:%s)' % (
     r'(?:([1-9]|1\d|2[0-9]))') # 1-29 any year (including potential leap years) 

    result = '|'.join('(?:%s)' % x for x in (thirties, thirtyones, feb)) 
    r = re.compile(result) 

    for ind, phrase in enumerate(csv_data): 
     if r.match(phrase): 
      # If you've found a date string, a year string will follow 
      new_data[ind] = ", ".join(csv_data[ind:ind+2]) 
      del csv_data[ind+1] 

    for line in csv_data: print line 
+1

なぜuスニファを使用していないのですか?すべて自動的に見つかるはずですよね? –

+1

あなたはそうです、そうです。それは完璧に良いアプローチです。私はちょうど区切り文字を明示的に指定すると、私の答えがあなたにはっきりと分かると思いました。あなたは 'dialect = csv.Sniffer()。sniff(new_data)'を定義し、それを 'csv.reader()'行に入力することができます: 'csv.reader(new_data.splitlines()、dialect)'。注:元の 'csvfile'は二重引用符を持ち、' ​​Sniffer'は自動的にCSVの適切な区切り文字/書式を検出しないので、二重引用符を削除した後は 'csvfile'を参照しないでください。 –

+0

あなたのアプローチを試しましたが、日付が正しくない、結果が 'Jan 1'、 '2017' =>別のフィールドとして区切られていますが、これは 'Jan 1、2017'にする必要があります。実際、これは区切り記号としてカンマを認識したときに問題になっていましたが、日付フィールドも区切られていて、これは私の妥当な結果ではありません。 –

関連する問題