web-dev-qa-db-ja.com

ヘッダー付きのCSVファイルからテーブルを作成する

指定したCSVの内容のみに基づいて新しいMySQLテーブルを生成する方法を探しています。私が使用するCSVファイルには、次のプロパティがあります。

  • 「|」区切られた。
  • 最初の行は列名(ヘッダー)を指定し、 "|"も指定します区切られた。
  • 列名と順序は固定されていません。
  • 列の数は固定されていません。
  • ファイルのサイズが大きい(1 mil行/ 50列)。

Excelではこれはすべてかなり単純ですが、MySQLではそうではありません(Googleでは運がありません)。私が見ているべきものについて何か提案はありますか?

12
user58602

csvsql を使用できます。これはcsvkit(CSVファイルに変換して操作するための一連のユーティリティ)の一部です。

  • LinuxまたはMac OS X
  • フリーでオープンソース
  • Sudo pip install csvkit
  • 例:csvsql --dialect mysql --snifflimit 100000 datatwithheaders.csv > mytabledef.sql
  • ファイルの内容に基づいてCREATE TABLEステートメントを作成します。列名はCSVファイルの最初の行から取得されます。
10

Pythonの使用に問題がなければ、Pandasがうまく機能しました(csvsqlは永久にハングし、ケースよりもcolsとrowが少なくなります)。次のようなもの:

from sqlalchemy import create_engine
import pandas as pd

df = pd.read_csv('/PATH/TO/FILE.csv', sep='|')
# Optional, set your indexes to get Primary Keys
df = df.set_index(['COL A', 'COL B'])

engine = create_engine('mysql://user:pass@Host/db', echo=False)

df.to_sql(table_name, engine, index=False)
2
ivansabik

さまざまな列のデータ型、サイズなどに基づいてCREATE TABLEを生成する必要があります。

次に、LOAD DATA INFILE ... '|'で終了するフィールドを使用します"\ n"で終了する行SKIP 1 LINE ...; (詳細はマニュアルページを参照してください。)

各csv->テーブルについても同様に行います。

0
Rick James