2016-07-29 86 views
0

我试图确定.csv文件的每一列中包含的数据的类型,以便我可以为MySQL创建CREATE TABLE语句。该程序将列出所有列标题,然后获取第一行数据并确定每种数据类型并将其附加到列标题以获取正确的语法。例如:查找没有空字符串的行

ID Number Decimal Word 
0 17  4.8  Joe 

这会产生类似CREATE TABLE table_name (ID int, Number int, Decimal float, Word varchar());的东西。

问题是,在某些.csv文件中,第一行包含一个NULL值,该值作为空字符串读取并混淆该过程。我的目标是搜索每一行,直到找到一个不包含NULL的值,并在形成语句时使用该值。这是我迄今所做的,只是它有时仍然会返回行包含空字符串:

def notNull(p): # where p is a .csv file that has been read in another function 
    tempCol = next(p) 
    tempRow = next(p) 
    col = tempCol[:-1] 
    row = tempRow[:-1] 
    if any('' in row for row in p): 
     tempRow = next(p) 
     row = tempRow[:-1] 
    else: 
     rowNN = row 
    return rowNN 

注:.csv文件读取是在不同的函数中完成,而这个功能只需使用已读.csv文件作为输入p。此外,每行以,结尾,将其视为一个额外的空字符串,因此在检查每行的最后一个值之前,先检查它是否为空字符串。

问题:我创建的函数有什么问题导致它不总是返回没有空字符串的行?我觉得这是因为循环没有必要重复,但我不太清楚如何解决这个问题。

+0

你能否说明p的类型是什么?它是一串字符串列表吗? –

+0

我在_Note_下面提到了它的功能。 'p'是另一个函数读取的'.csv'文件。 – ThoseKind

回答

2

我无法真正解读你的代码。这是我会做的只有没有空字符串的行。

import csv 

def g(name): 
    with open('file.csv', 'r') as f: 
     r = csv.reader(f) 
     # Skip headers 
     row = next(r) 

     for row in r: 
      if '' not in row: 
       yield row 

for row in g('file.csv'): 
    print('row without empty values: {}'.format(row)) 
+0

对不起,它不是很容易破译,因为它是一个大得多的程序的一小部分,最终会太多粘贴和解释。然而,你的回答帮助我得到了我想要的东西。谢谢! – ThoseKind