質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Blockchain

Blockchain(ブロックチェーン)とは、分散型台帳技術もしくは分散型ネットワークのことを指します。クラウド上のデータを分散し、ノード間でデータの相違があった際には他ノードの合意によって信頼性が高いデータを判断。データの確保および信憑性を保持する技術です。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

解決済

csvファイルを前から3列、後ろから2列といった形で取得したい

yostito
yostito

総合スコア0

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Blockchain

Blockchain(ブロックチェーン)とは、分散型台帳技術もしくは分散型ネットワークのことを指します。クラウド上のデータを分散し、ノード間でデータの相違があった際には他ノードの合意によって信頼性が高いデータを判断。データの確保および信憑性を保持する技術です。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

2回答

0評価

0クリップ

1176閲覧

投稿2019/02/09 06:45

前提・実現したいこと

列数が一定出ない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

ソースコード file_list = sorted(glob.glob(r'/ファイルパス/*.csv')) ##カラム定義 cols = ['txid', 'blocktime','addresses','n','value'] ##SQL Serverに入れる用データフレーム df_vout = pd.DataFrame(index=[], columns=cols) ##tmp用データフレーム record = pd.DataFrame(index=[], columns=cols) for filename in file_list: ##SQL Serverに入れる用データフレーム df_vout = pd.DataFrame(index=[], columns=cols) ##tmp用データフレーム record = pd.DataFrame(index=[], columns=cols) with open(filename) as f: reader = csv.reader(f) #下記rowにはリストが入る #1行ずつ取り出し for row in reader: print(row_count) #原則として要素数は5個。5個の場合はvalueだけfloatで変換して素直に入れる。 if len(row)==5: #アドレス列は"[アドレス]”という形式で入るので、不要な[]"を空白に置換 row[2] = row[2].replace('[','') row[2] = row[2].replace(']','') row[2] = row[2].replace('"','') #valueは指数表記で入ってくることがあるので、floatで数値に変換してあげる record =pd.Series([row[0],row[1],row[2],row[3],float(row[4])],index=df_vout.columns) df_vout =df_vout.append(record,ignore_index=True) #6以上の場合はアドレスに2つ以上あるので、結合する必要があり。最悪結合しないで、最初のアドレスでOK elif len(row)==6: concati_address_6 = row[2]+row[3] concati_address_6 = concati_address_6.replace('[','') concati_address_6 = concati_address_6.replace(']','') concati_address_6 = concati_address_6.replace('"','') record = pd.Series([row[0],row[1],concati_address_6,row[4],float(row[5])], index=df_vout.columns) df_vout = df_vout.append(record,ignore_index=True) #ファイル単位でSQL Serverに書き込み df_vout.columns = ['txid', 'blocktime','addresses','n','value'] df_vout.to_sql("テーブル名", engine, if_exists='append', index=False, chunksize=8)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

hayataka2049
hayataka2049

2019/02/09 06:51

前から3行、後ろから2行では?
yostito
yostito

2019/02/09 07:00

コメントありがとうございます。 サンプルの例ですと、下記のような形に整形したいので、前から3列、後ろから2列取り込みたいのです。 aaa,1445965775,a,1,0.0027 bbb,1445965775,b,1,0.05075575 ccc,1445965775,c,0,2.86008262
hayataka2049
hayataka2049

2019/02/09 07:01

もしかして、a,b,c,d,e,fからa,b,c,e,fを取るということでしょうか。 bbb,1445965775,["b","bb","bbb"],1,0.05075575 みたいな例は何列になるとお考えですか?(途中の[]間のカンマの扱い)
yostito
yostito

2019/02/09 07:02

はい、そのように取りたいと思っています。上記例でカンマ区切りのファイルですと、7列になると考えています

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Blockchain

Blockchain(ブロックチェーン)とは、分散型台帳技術もしくは分散型ネットワークのことを指します。クラウド上のデータを分散し、ノード間でデータの相違があった際には他ノードの合意によって信頼性が高いデータを判断。データの確保および信憑性を保持する技術です。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。