2016-07-25 2 views
0

私はPythonのcsvモジュールを使って ".csv"ファイルを読み込み、それらをMySQLのinsert文に解析しています。ステートメントの構文を維持するために、各列ヘッダーの下にリストされている値のタイプを判別する必要があります。しかし、いくつかの行がnullの値で始まるので、私は問題に遭遇しました。同じ列ヘッダの次の値を引き出す

返された値がないnullなるまでどのように私は、同じ列の下に次の値を返すようにcsvモジュールを使用することができますか?これは、csvモジュールで実行する必要はありません。私はすべてのソリューションにオープンしています。ドキュメンテーションを見た後、私は、csvモジュールが必要なことをすることができるとは確信していません。私はこれらの線に沿って何かを考えていた:

if rowValue == '': 
    rowValue = nextRowValue(row) 

は明らかnext()方法は単純ではなく、私が欲しいのように同じ列の下に次の値を返すよりも、CSV、「リスト」内の次の値を返し、nextRowValue()オブジェクトにはありません存在する。私はちょうどそのアイデアを実証しています。

編集:コンテキストを追加するだけで、ここでは私がやっていることの例と私が取り組んでいる問題を示します。

次のようにテーブルの場合:

ID Date Time Voltage Current Watts 
0 7/2 11:15   0  0 
0 7/2 11:15   0  0 
0 7/2 11:15 380 1  380 

そして、ここでは、私は、テーブルを読んで列ヘッダを取得し、からの値の種類を決定するために使用していたコードの非常にスリムバージョンです最初の行その後、それらを別々のリストに入れてから、dequeを使用して、それらを別の関数内にステートメントを挿入するために追加します。タイプはfindType関数から返される値の残りの部分など

import csv, os 
from collections import deque 

def findType(rowValue): 
    if rowValue == '': 
     rowValue = 
    if '.' in rowValue: 
     try: 
      rowValue = type(float(rowValue)) 
     except ValueError: 
      pass 
    else: 
     try: 
      rowValue = type(int(rowValue)) 
     except: 
      rowValue = type(str(rowValue)) 
    return rowValue 

def createTable(): 
    inputPath = 'C:/Users/user/Desktop/test_input/' 
    outputPath = 'C:/Users/user/Desktop/test_output/' 
    for file in os.listdir(inputPath): 
     if file.endswith('.csv'): 
      with open(inputPath + file) as inFile: 
       with open(outputPath + file[:-4] + '.sql', 'w') as outFile: 
        csvFile = csv.reader(inFile) 
        columnHeader = next(csvFile) 
        firstRow = next(csvFile) 
        cList = deque(columnHeader) 
        rList = deque(firstRow) 
        hList = [] 
        for value in firstRow: 
         valueType = findType(firstRow) 
         if valueType == str: 
          try: 
           val = '`' + cList.popleft() + 'varchar(255)' 
           hList.append(val) 
          except IndexError: 
           pass 
         etc. 

そして:すべてのコードが紹介されて、私はいくつかの重要な部分を残している可能性がありますが、ここでは一例です。問題は、dequeを使用してrListに値を追加すると、nullの値をスキップし、列ヘッダーのリスト内の項目数が6になり、行のリスト内の項目数が5になるということです彼らは並んでいないだろう。

for value in firstRow: 
    if value == '': 
     firstRow = next(csvFile) 

および行をなしnull値を発見されるまでこのループを継続:

幾分引き出さ溶液を1がこのようなものを用いて見出されるまでnull値の各行をスキャンすることであろう。しかし、これはプログラムを遅くするような解決策のように思われるので、なぜ私は別の解決策を探しています。

+0

入力ファイルの数行を表示し、問題の原因となる行を特定します。 –

+0

@joelgoldstickが編集されました。 – ThoseKind

+1

csv.readerで行を読むと、リストが得られます。リストの長さを確認してください。十分なフィールドがない場合は、その行を処理せずに次の行に移動してください。 –

答えて

1

タイトルからわかるように、列から次の値を引き出すのではなく、nullの値を含む行をスキップするほうが簡単でした。

ループを使用して各行をスキャンし、nullの値が含まれているかどうかを確認し、nullの値が1つ見つかるまで次の行にジャンプします。たとえば、

tempRow = next(csvFile) 
for value in tempRow: 
    if value == '': 
     tempRow = next(csvFile) 
    else: 
     row = tempRow 
関連する問題