2016-09-22 52 views
0

我有一個數據轉儲是「搞砸」的CSV。 (大約100個文件,每個文件大約有1000行實際CSV數據。)
轉儲除CSV外還有一些其他文本。如何以編程方式單獨提取CSV部分?在Python中識別csv

作爲一個例子,數據文件看起來像這樣的事情

Session:1 
Data collection date: 09-09-2016 
Related questions: 
    Question 1: parta, partb, partc, 
    Question 2: parta, partb, partc 

"field1","field2","field3","field4" 
"data11","data12","data13","data14" 
"data21","data22","data23","data24" 
"data31","data32","data33","data34" 
"data41","data42","data43","data44" 
"data51","data52","data53","data54" 

我需要提取CSV一部分。

注意事項,
開頭的文字不限於4-5行。
額外的文本不只是在

我看到this post的文件的開頭是建議使用re.split和/或csv.Sniffer, 但是我的嘗試是不是卓有成效。

with open("untitled.csv") as csvfile: 
    dialect = csv.Sniffer().sniff(csvfile.read(1024)) 
    csvfile.seek(0) 
    print(dialect.__dict__) 
    csvstarts = False 
    csvdump = [] 
    for ln in csvfile.readlines(): 
     toks = re.split(r'[,]', ln) 
     print(toks) 
     if toks[0] == '"field1"' and not csvstarts: # identify by the header line 
      csvstarts = True 
      continue 
     if csvstarts: 
      if toks[0] == '"field1"': # identify the start of subsequent csv data 
       csvstarts = False 
       continue 
      csvdump.append(ln) # record the current line 

    print(csvdump) 

現在,只有存在一堆數據時,我才能夠準確識別csv行。

有什麼更好的我可以做嗎?

+0

什麼分開行與數據和行與文本呢?如果文本行以「? – Aidenhjj

+0

」開始,那麼這就是問題出在哪裏,除非您將空白行視爲分隔符,否則沒有任何東西可以將csv數據與文本分開。 – okkhoy

回答

1

如何:

import re 

my_pattern = re.compile("(\"[\w]+\",)+") 

with open('<your_file>', 'rb') as fi: 
    for f in fi: 
     result = my_pattern.match(f) 
     if result: 
      print f 

假設CSV數據可以從分化通過在其中沒有特殊字符(我們只接受每個元素使用雙引號和逗號分隔下一個元素)

+0

注意自我:必須學習如何使用正則表達式。 – Aidenhjj

+0

如果能解決您的問題,您可以接受答案 –

+0

不是我的問題! – Aidenhjj

0

如果您的CSV行,只有這些行以\」開始,那麼你可以這樣做:

import csv 

data = list(csv.reader(open("test.csv", 'rb'), quotechar='¬')) 
# for quotechar - use something that won't turn up in data 

def importCSV(data): 
    # outputs list of list with required data 
    # works on the assumption that all required data starts with \" 
    # and that no text starts with \" 

    out = [] 

    for line in data: 
     if (line != []) and (line[0][0] == "\""): 
      line = [el.replace("\"", "") for el in line] 
      out.append(line) 

    return out 

useful = importCSV(data) 
0

您是否可以不讀取每個元素線,並做一個正則表達式來查看天氣或不拉數據? 也許是這樣的:

^([ 「] [\ W] [」] [,])+ [ 「] [\ W] [」] $

我的正則表達式是不是最好的,有可能有更好的方法,但似乎對我有用。