Crie uma tabela a partir de um arquivo CSV com cabeçalhos

12

Estou procurando encontrar uma maneira de gerar uma nova tabela MySQL exclusivamente com base no conteúdo de um CSV especificado. Os arquivos CSV que vou usar possuem as seguintes propriedades;

  • "|" delimitado.
  • Primeira linha especifica os nomes das colunas (cabeçalhos), também "|" delimitado.
  • Os nomes e a ordem das colunas não são fixos.
  • O número de colunas não é fixo.
  • Os arquivos são de tamanho grande (1 mil linhas / 50 colunas).

No Excel, tudo isso é bastante simples, no entanto, com o MySQL, não parece ser (sem sorte com o Google). Alguma sugestão sobre o que eu deveria estar olhando?

user58602
fonte

Respostas:

10

Você pode usar o csvsql , que faz parte csvkit(um conjunto de utilitários para converter e trabalhar com arquivos CSV):

  • Linux ou Mac OS X
  • fonte livre e aberta
  • sudo pip install csvkit
  • Exemplo: csvsql --dialect mysql --snifflimit 100000 datatwithheaders.csv > mytabledef.sql
  • Ele cria uma CREATE TABLEdeclaração com base no conteúdo do arquivo. Os nomes das colunas são obtidos da primeira linha do arquivo CSV.
Franck Dernoncourt
fonte
2

Se você está bem com o Python, o Pandas funcionou muito bem para mim (o csvsql ficou pendurado para sempre e menos colunas e linhas do que no seu caso). Algo como:

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
fonte
Onde você define dwh_engine? Isso é um erro de digitação e você quis dizer engine?
joanolo
Sim deveria ser engine! Corrigida a resposta obrigado por detectar
ivansabik 28/03
to_sql leva muito tempo se o número de linhas for alto. Para nós, cerca de 36000 linhas demoraram cerca de 90 minutos. Uma instrução de carregamento direto foi realizada em 3 segundos.
precisa saber é o seguinte
0

Você precisa gerar um CREATE TABLE com base em tipos de dados, tamanho, etc. das várias colunas.

Então você usa LOAD DATA INFILE ... CAMPOS TERMINADOS POR '|' LINHAS TERMINADAS POR "\ n" LINHA SKIP 1 ...; (Consulte a página do manual para obter detalhes.)

Faça o mesmo para cada tabela csv ->.

Rick James
fonte