2009-08-13 60 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 2009-08-13 14:32:43

+1

這不是CSV。所以,你不能使用任何CSV解析技術。這是一些其他的格式,恰好有一些逗號,但絕對不是在任何意義上的單詞的CSV。請停止將其稱爲CSV。稱之爲「類CSV」或「隨機逗號值」。 – 2009-08-13 19:45:00

回答

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 2009-08-13 16:23:31

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/ – 2009-08-13 14:32:25

1

先反轉字符串,然後處理它。

TMP = TMP [:: - 1]

1

從您提供的示例中,它看起來像「列」是固定大小。首先(帶逗號的)長度爲16個字符,爲什麼不嘗試逐行讀取文件,然後每行讀取前16個字符(作爲第一列的值),其餘部分相應地?在獲得每個值之後,您可以進一步解析它(修剪空格,等等......)。

+0

我只是格式化它,爲你的觀賞樂趣 – dassouki 2009-08-13 14:35:28

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%作爲最後三列是int類型的。我們按原樣收到文件。我們無法控制這一代。地獄,我什至不知道他們用什麼來生成它們 – dassouki 2009-08-13 14:38:46

+0

我最喜歡的報價是「我愛IT標準......有這麼多的選擇!」缺少的是,即使在選擇了衆多標準中的一個之後,仍有一百萬種方法可以把它搞砸。很高興看到你找到了解決辦法,我挺喜歡的正則表達式的解決方案太多,但它是昂貴的處理器,明智的(舊的Perl程序員情有獨鍾的正則表達式)。祝你好運! – Lazarus 2009-08-14 08:43:29

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 2009-08-13 16:24:03