Gere instruções SQL de inserção a partir de um arquivo CSV
Pergunta
Preciso importar um arquivo csv para Pássaro de Fogo e passei algumas horas experimentando algumas ferramentas e nenhuma atendeu às minhas necessidades.
O principal problema é que todas as ferramentas que tenho tentado, como Importação de dados EMS e Assistente de dados Firebird espero que meu arquivo CSV contenha todas as informações necessárias para minha tabela.
Preciso escrever algum SQL customizado na instrução insert, por exemplo, tenho um arquivo CSV com o nome da cidade, mas como meu banco de dados já possui todas as cidades em outra tabela (normalizada), preciso escrever um subselect no insert instrução para procurar a cidade e escrever seu ID, também tenho um procedimento armazenado para criar GUIDS.
Minha instrução de inserção seria algo assim:
INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES((SELECT NEW_GUID FROM CREATE_GUID), :NAME, (SELECT CITY_ID FROM CITY WHERE NAME = :CITY_NAME)
Como posso abordar isso?
Solução
É um pouco grosseiro - mas para trabalhos pontuais, às vezes uso o Excel.
Se você importar o arquivo CSV para o Excel, poderá criar uma fórmula que crie uma instrução INSERT usando concatenação de strings na fórmula.Então - se o seu arquivo CSV tiver 3 colunas que aparecem nas colunas A, B e C no Excel, você poderia escrever uma fórmula como...
="INSERT INTO MyTable (Col1, Col2, Col3) VALUES (" & A1 & ", " & B1 & ", " & C1 & ")"
Em seguida, você pode replicar a fórmula em todas as suas linhas e copiar e colar a resposta em um arquivo de texto para executar em seu banco de dados.
Como eu disse – é grosseiro – mas pode ser uma maneira bastante “rápida e suja” de realizar um trabalho!
Outras dicas
Bem, se for um CSV, e este for um processo único, abra o arquivo no Excel e, em seguida, escreva fórmulas para preencher seus dados da maneira que desejar e, em seguida, escreva uma fórmula Concat simples para construir seu SQL, e em seguida, copie essa fórmula para cada linha.Você obterá um grande número de instruções SQL que podem ser executadas em qualquer lugar que desejar.
Fábio,
Já fiz o que Vaibhav fez muitas vezes e é uma boa maneira "rápida e suja" de colocar dados em um banco de dados.
Se você precisar fazer isso algumas vezes ou em algum tipo de agendamento, uma maneira mais confiável é carregar os dados CSV "no estado em que se encontram" em uma tabela de trabalho (ou seja, customer_dataload) e, em seguida, usar instruções SQL padrão para preencher o campos faltantes.
(Não conheço a sintaxe do Firebird - mas algo como...)
UPDATE person
SET id = (SELECT newguid() FROM createguid)
UPDATE person
SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)
etc.
Normalmente, é muito mais rápido (e confiável) colocar os dados no banco de dados e depois corrigi-los do que tentar corrigi-los durante o upload.Você também obtém o benefício de transações que permitem ROLLBACK se não funcionar!!
Você pode importar o arquivo CSV para uma tabela como está e, em seguida, escrever uma consulta SQL que faça todas as transformações necessárias na tabela importada e insira o resultado na tabela de destino.
Então, algo como:
<(carregue o arquivo CSV em temp_table - n, city_name)>
inserir em target_table
selecione t.n, c.city_id como cidade
de temp_table t, cidades c
onde t.nome_da_cidade = c.nome_da_cidade
Boa dica sobre como usar o Excel, mas também sugiro que você se sinta confortável com uma linguagem de script como Python, porque para algumas tarefas é mais fácil escrever um script python rápido para fazer o trabalho do que tentar encontrar a função que você precisa no Excel ou em um pré- ferramenta feita que faz o trabalho.
use o arquivo csv como uma tabela externa.Então você pode usar SQL para copiar os dados da tabela externa para sua tabela de destino - com todas as possibilidades do SQL.Ver http://www.firebirdsql.org/index.php?op=useful&id=netzka
eu faria isso com estranho.
Por exemplo, se você tivesse essas informações em um arquivo CSV:
Bob,New York
Jane,San Francisco
Steven,Boston
Marie,Los Angeles
O comando a seguir fornecerá o que você deseja, execute no mesmo diretório do seu arquivo CSV (chamado name-city.csv
neste exemplo).
$ awk -F, '{ print "INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES ((SELECT NEW_GUID FROM CREATE_GUID), '\''"$1"'\'', (SELECT CITY_ID FROM CITY WHERE NAME = '\''"$2"'\''))" }' name-city.csv
Tipo awk --help
Para maiores informações.
Acabei de terminar este script VBA que pode ser útil para essa finalidade.Tudo o que você precisa fazer é alterar a instrução Insert para incluir a tabela em questão e a lista de colunas (obviamente na mesma sequência em que aparecem no arquivo Excel).
Function CreateInsertStatement()
'Output file location and start of the insert statement
SQLScript = "C:\Inserts.sql"
cStart = "Insert Into Holidays (HOLIDAY_ID, NAT_HOLDAY_DESC, NAT_HOLDAY_DTE) Values ("
'Open file for output
Open SQLScript For Output As #1
Dim LoopThruRows As Boolean
Dim LoopThruCols As Boolean
nCommit = 1 'Commit Count
nCommitCount = 100 'The number of rows after which a commit is performed
LoopThruRows = True
nRow = 1 'Current row
While LoopThruRows
nRow = nRow + 1 'Start at second row - presuming there are headers
nCol = 1 'Reset the columns
If Cells(nRow, nCol).Value = Empty Then
Print #1, "Commit;"
LoopThruRows = False
Else
If nCommit = nCommitCount Then
Print #1, "Commit;"
nCommit = 1
Else
nCommit = nCommit + 1
End If
cLine = cStart
LoopThruCols = True
While LoopThruCols
If Cells(nRow, nCol).Value = Empty Then
cLine = cLine & ");" 'Close the SQL statement
Print #1, cLine 'Write the line
LoopThruCols = False 'Exit the cols loop
Else
If nCol > 1 Then 'add a preceeding comma for all bar the first column
cLine = cLine & ", "
End If
If Right(Left(Cells(nRow, nCol).Value, 3), 1) = "/" Then 'Format for dates
cLine = cLine & "TO_DATE('" & Cells(nRow, nCol).Value & "', 'dd/mm/yyyy')"
ElseIf IsNumeric(Left(Cells(nRow, nCol).Value, 1)) Then 'Format for numbers
cLine = cLine & Cells(nRow, nCol).Value
Else 'Format for text, including apostrophes
cLine = cLine & "'" & Replace(Cells(nRow, nCol).Value, "'", "''") & "'"
End If
nCol = nCol + 1
End If
Wend
End If
Wend
Close #1
End Function
Você pode usar o grátis csvsql para fazer isso.
- Instale-o usando estas instruções
Agora execute um comando como este para importar seus dados para seu banco de dados.Mais detalhes nos links acima, mas seria algo como:
csvsql --db firebase:///d=mydb --insert mydata.csv
O seguinte funciona com sqlite e é o que eu uso para converter dados em um formato fácil de consultar
csvsql --db sqlite:///dump.db --insert mydata.csv
Opção 1:1- você já experimentou o IBExert?IBExpert \ Ferramentas \ Importar dados (versão de teste ou cliente).
opção 2:2- carregue seu arquivo csv para uma tabela temporária com F_BLOBLOAD.3- Crie um procedimento armazenado, que usou 3 funções (f_stringLength, f_strcopy, f_mid), você atravessa toda a sua string, puxando seus campos para construir sua inserção.
links:2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html
Uma ferramenta que experimentei recentemente e que funcionou muito bem é SQL.
Você escreve um comando IMPORT, cola-o em FSQL
e importa o arquivo CSV para a tabela Firebird.