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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top