前提・実現したいこと
列数が一定出ないcsvファイルがあり、前から1,2,3列と後ろから1,2列だけを取得してデータベース入れたいです。
また、前から3列目には不要な文字が含まれており(”と[]),それを取り除きたいです。
対象のcsvファイルが1ファイル100万行で1000ファイル程度ある為、パフォーマンスが良い方法で行いたいです。
発生している問題
下記コードの方法で、1行ずつ列数を取得して列数別に処理しているのですが、20万行処理するのに1時間程度かかっています。単純にcsvファイルを読み込んでSQL Serverに格納するだけならば100万行で2分-3分で終わるので、そのくらいのパフォーマンスを出したいです。
###csvファイルサンプル
aaa,1445965775,["a"],1,0.0027 bbb,1445965775,["b","bb","bbb"],1,0.05075575 ccc,1445965775,["c","cc"],0,2.86008262
該当のソースコード
python
1ソースコード 2file_list = sorted(glob.glob(r'/ファイルパス/*.csv')) 3##カラム定義 4cols = ['txid', 'blocktime','addresses','n','value'] 5##SQL Serverに入れる用データフレーム 6df_vout = pd.DataFrame(index=[], columns=cols) 7##tmp用データフレーム 8record = pd.DataFrame(index=[], columns=cols) 9 10for filename in file_list: 11 ##SQL Serverに入れる用データフレーム 12 df_vout = pd.DataFrame(index=[], columns=cols) 13 ##tmp用データフレーム 14 record = pd.DataFrame(index=[], columns=cols) 15 with open(filename) as f: 16 reader = csv.reader(f) 17 #下記rowにはリストが入る 18 #1行ずつ取り出し 19 for row in reader: 20 print(row_count) 21 #原則として要素数は5個。5個の場合はvalueだけfloatで変換して素直に入れる。 22 if len(row)==5: 23 #アドレス列は"[アドレス]”という形式で入るので、不要な[]"を空白に置換 24 row[2] = row[2].replace('[','') 25 row[2] = row[2].replace(']','') 26 row[2] = row[2].replace('"','') 27 #valueは指数表記で入ってくることがあるので、floatで数値に変換してあげる 28 record =pd.Series([row[0],row[1],row[2],row[3],float(row[4])],index=df_vout.columns) 29 df_vout =df_vout.append(record,ignore_index=True) 30 #6以上の場合はアドレスに2つ以上あるので、結合する必要があり。最悪結合しないで、最初のアドレスでOK 31 elif len(row)==6: 32 concati_address_6 = row[2]+row[3] 33 concati_address_6 = concati_address_6.replace('[','') 34 concati_address_6 = concati_address_6.replace(']','') 35 concati_address_6 = concati_address_6.replace('"','') 36 record = pd.Series([row[0],row[1],concati_address_6,row[4],float(row[5])], index=df_vout.columns) 37 df_vout = df_vout.append(record,ignore_index=True) 38 39 #ファイル単位でSQL Serverに書き込み 40 df_vout.columns = ['txid', 'blocktime','addresses','n','value'] 41 df_vout.to_sql("テーブル名", engine, if_exists='append', index=False, chunksize=8)
回答2件
あなたの回答
tips
プレビュー