私は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
値の各行をスキャンすることであろう。しかし、これはプログラムを遅くするような解決策のように思われるので、なぜ私は別の解決策を探しています。
入力ファイルの数行を表示し、問題の原因となる行を特定します。 –
@joelgoldstickが編集されました。 – ThoseKind
csv.readerで行を読むと、リストが得られます。リストの長さを確認してください。十分なフィールドがない場合は、その行を処理せずに次の行に移動してください。 –