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


12

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

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

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

回答:


10

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

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

2

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)

どこで定義しますdwh_engineか?これはタイプミスengineですか?
joanolo 2017年

はい、そうengineです!スポッティングへの感謝の答えを修正
ivansabik 2017年

行数が多い場合、to_sqlは時間がかかりすぎます。私たちにとって、約36000行は約90分かかりました。ダイレクトロードステートメントは3秒で完了しました。
mvinayakam 2018

0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.