2016-09-22 44 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] [”] $

我的正则表达式是不是最好的,有可能有更好的方法,但似乎对我有用。