Buat tabel dari file CSV dengan header

12

Saya sedang mencari cara untuk menghasilkan tabel MySQL baru hanya berdasarkan pada isi CSV yang ditentukan. File CSV yang akan saya gunakan memiliki properti berikut;

  • "|" dibatasi
  • Baris pertama menentukan nama kolom (header), juga "|" dibatasi
  • Nama kolom & pesanan tidak diperbaiki.
  • Jumlah kolom tidak tetap.
  • File berukuran besar (1 mil baris / 50 kolom).

Dalam Excel ini semua agak sederhana, namun dengan MySQL sepertinya tidak (tidak beruntung dengan Google). Ada saran tentang apa yang harus saya lihat?

pengguna58602
sumber

Jawaban:

10

Anda dapat menggunakan csvsql , yang merupakan bagian dari csvkit(seperangkat utilitas untuk mengonversi dan bekerja dengan file CSV):

  • Linux atau Mac OS X
  • sumber bebas dan terbuka
  • sudo pip install csvkit
  • Contoh: csvsql --dialect mysql --snifflimit 100000 datatwithheaders.csv > mytabledef.sql
  • Itu membuat CREATE TABLEpernyataan berdasarkan konten file. Nama kolom diambil dari baris pertama file CSV.
Franck Dernoncourt
sumber
2

Jika Anda setuju dengan menggunakan Python, Pandas bekerja sangat baik untuk saya (csvsql digantung selamanya dan lebih sedikit cols and row daripada di case Anda). Sesuatu seperti:

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)
ivansabik
sumber
Di mana Anda mendefinisikan dwh_engine? Apakah ini salah ketik dan maksud Anda engine?
joanolo
Ya itu seharusnya engine! Mengoreksi jawaban, terima kasih telah melihat
ivansabik
to_sql membutuhkan terlalu banyak waktu jika jumlah baris tinggi. Bagi kami, sekitar 36.000 baris membutuhkan waktu sekitar 90 menit. Pernyataan beban langsung dilakukan dalam 3 detik.
mvinayakam
0

Anda perlu membuat CREATE TABLE berdasarkan tipe data, ukuran, dll dari berbagai kolom.

Kemudian Anda menggunakan LOAD DATA INFILE ... BIDANG DITENTUKAN OLEH '|' SALURAN DITENTUKAN OLEH "\ n" LAYANAN SKIP 1 ...; (Lihat halaman manual untuk detailnya.)

Lakukan juga untuk setiap tabel csv ->.

Rick James
sumber