2009-08-13 23 views
3

私は、次の形式のCSVファイルを持っている:解析するCSVファイルには、後方

CSV FILE 
"a"    , "b"  , "c" , "d" 
hello, world , 1  , 2 , 3 
1,2,3,4,5,6,7 , 2  , 456 , 87 
h,1231232,3  , 3  , 45 , 44 

問題は、最初のフィールドは、その中にカンマを「」があるということです。私は、ファイルの生成を制御しません。その形式は私が受け取る形式です。CSVファイルを行末から先頭に読む方法はありますか?

正しい方向に案内されていれば、少しPythonスクリプトを書いても構いません。

+2

多分、彼はそれを明確にするために固定長フィールドのように見せましたか? 最初のフィールドに一重引用符文字が含まれていない区切り文字が含まれている場合は、形式が整えられたCSVではありません。 – davewasthere

+1

これはCSVではありません。したがって、CSV解析技術は使用できません。カンマがいくつかある他の形式ですが、単語の意味でCSVではありません。それをCSVと呼ぶのをやめてください。それを「CSVのような」または「ランダムなカンマの値」と呼んでください。 –

答えて

15

rsplit文字列メソッドは、左の代わりに右から始まる文字列を分割し、それはあなたが探しているものはおそらくだ(それが取る引数が指定分割する回数の最大数):

line = "hello, world , 1  , 2 , 3" 
parts = line.rsplit(",", 3) 
print parts # prints ['hello, world ', ' 1  ', ' 2 ', ' 3'] 

あなたが分割さリスト内の各項目の先頭と末尾から空白を取り除くしたい場合は、あなただけのリスト内包

stripメソッドを使用することができます
parts = [s.strip() for s in parts] 
print parts # prints ['hello, world', '1', '2', '3'] 
+1

偉大な、ありがとう、バンドル – dassouki

1

あなたは常に(perlの正規表現)のような正規表現の、と何かができる

#!/usr/bin/perl 

use IO::File; 

if (my $file = new IO::File("test.csv")) 
{ 
    foreach my $line (<$file>) { 
    $line =~ m/^(.*),(.*?),(.*?),(.*?)$/; 
    print "[$1][$2][$3][$4]\n"; 
    } 
} else { 
    print "Unable to open test.csv\n"; 
} 

(最初は欲張り探索され、最後の3はありません) 編集:完全なコードを掲載だけではなく正規表現

+5

http://xkcd.com/208/ –

1

最初に文字列を逆にして処理します。

TMP = tmpに[:: - 1]

1

サンプルからは、「列」は固定サイズのように見えます。最初のファイル(カンマの付いたファイル)は16文字ですから、ファイルを1行ずつ読み込み、最初の16文字(最初の列の値)を読み込み、それに応じて残りの行を読み込みます。それぞれの価値があると、それをさらに解析することができます(空白を整えるなど)。

+0

私はちょうどあなたの視聴喜びのためにそれをフォーマットしました – dassouki

1

これはCSVファイルではなく、カンマで区切っても意味します。

どのようにしていないという確信することができます:

CSV FILE 
"a"    , "b"  , "c" , "d" 
hello   , world , 1 , 2 , 3 
1    , 2  , 3 , 4 , 5,6,7,2,456,87 
h    , 1231232 , 3 , 3 , 45,44 

ファイルは、あなたが最初のグループは、引用符で囲む必要があり、その後示すようフィールド名がフィールドにカンマが含まれるように奇数であるかのように、見えている場合そうではありません。

ソースからのエラーを修正するファンではありませんが、データジェネレータに戻って正しいCSVを配信するようにしています。

+0

良い点が、私は100%として最後の3つの列はint型です。私たちはファイルをそのまま受け取ります。我々は世代を支配していない。地獄、私は彼らがそれらを生成するために何を使用するかもわかりません – dassouki

+0

私のお気に入りの引用符の1つは "私はIT標準が大好きです...そこから選ぶことがたくさんあります!欠けていることは、多くの基準の1つが選択された後でさえ、それを倒すための百万の方法があるということです。あなたが解決策を見いだしてうれしく思っていますが、私はRegexソリューションも非常に好きでしたが、それは高価なプロセッサー(正規表現のソフトスポットを持つ古いPerlプログラマー)でしょう。あなたの処理と幸運! – Lazarus

0

常に同じ数の列が必要で、最初の列のみにカンマを含めることができる場合は、最初に何かを読み取り、余分な列を連結するだけです。

問題はインターフェイスがあいまいであり、回避することができますが、より良い解決方法はインターフェイスを固定することです(複数のパッチを作成するより難しい場合があります...)。

0

私はミルビールに同意します。それはひどく形成されたCSVファイルです。あなたの最善の策は、他の区切り文字を見つけるか、カンマや引用の過負荷を停止することです/あなたが逆の各行を読みたい、なぜ私は完全には理解していないコンマ

4

を分離する非フィールドを逃れるが、あなたはこれを行うことができます:

import csv 
file = open("mycsvfile.csv") 
reversedLines = [line[::-1] for line in file] 
file.close() 
reader = csv.reader(reversedLines) 
for backwardRow in reader: 
    lastField = backwardRow[0][::-1] 
    secondField = backwardRow[1][::-1] 
+0

うまくいったよ:Dありがとう – dassouki

関連する問題