CSVファイルを読み込んで、MySQLの挿入文として吐き出すPythonプログラムを作成しました。今度は、列ヘッダーを使用して新しいテーブルごとにCREATE
ステートメントを作成できる追加プログラムが必要です。 MySQLの書式設定のために、シェル内のtype()
関数に似た列の各値の型を判別できる必要があります。私の考えは、CSVファイルの2番目の行を列ヘッダーの後に読み込み、,
(つまり、各列から1つの値)で区切って値を引き出すことです。その値をとり、type()
関数を実行して、int, str, float, etc.
を返します。後での値をtype()
が返すようにして、CREATE
ステートメントの列ヘッダーの末尾に適切なデータ型を追加します。CSVファイルの行の値からデータ型を判断する
これまでのところ、私は最初の行のコンパイルされたリストからそれぞれの値を引っ張って、それがtype()
であることを表示していました。問題は、リスト内のすべてが文字列として扱われるため、唯一の戻り値は<class 'str'>
です。私がどのようなタイプの値を知っていれば、私は文字列から正しいタイプに変換することができますが、それはプログラムの全目的を破ります。私は、文字列のリストとして最初の行を吐き出さないようにするより良い方法があると確信していますが、それをどうするかわかりません。ここで私はこれまでと同様に継続する方法についてアイデアを持っているものです。
import csv, os
path = 'C:/Users/user/Desktop/file/test/'
for file in os.listdir(path):
if file.endswith('.csv'):
with open(path +file) as inFile:
with open(path + file[:-4] + ".txt", "w") as outFile:
csvFile = csv.reader(inFile)
columnHeader = next(csvFile)
firstRow = next(csvFile)
i = 0
for value in firstRow:
valueType = (type(value))
for header in columnHeader:
if valueType = class 'str': # Don't think this formatting is correct
columnHeader.append(' varchar (255)')
if valueType = class 'int':
columnHeader.append(' int')
if valueType = class 'float':
columnHeader.append(' float')
私もthisライブラリを使用してに見てきましたが、それを自分自身を行うことを好むだろう。
これを実行するために私が選択した方法は、もっともらしく/可能ですか?あなたがそれをするために考えることができるより良い方法はありますか?もしそうなら、どうですか?
あなたはテキストファイルから読んでいます。定義上、テキストファイルのすべてが文字列です。実際に個々のフィールドを手動で調べて、それが何であるか把握する必要があります。 '42' - >整数、' 42a' - >文字列、 '1.123' - > floatなど... –
良い質問があったのでしばらくお待ちください。ありがとう!! * try-exceptブロック( 'try:int(x)、except try:float(x)、str(x)'を除く)や 'eval'を使ったもの非常にエレガント。 –
@MarcBそれは私が上で言ったこととまったく同じです。これらのCSVファイルには膨大な量のデータが含まれているため、手動で行うことは妥当ではありません。 – ThoseKind