Generar instrucciones Insert SQL desde un archivo csv


Necesito importar un archivo csv en Firebird y he pasado un par de horas probando algunas herramientas y ninguna se ajusta a mis necesidades.

El principal problema es que todas las herramientas que he estado probando como EMS Data Import y Firebird Data Wizard esperan que mi archivo csv contenga toda la información necesaria para mi Tabla.

Necesito escribir un SQL personalizado en la instrucción insert, por ejemplo, tengo un archivo cvs con el nombre de la ciudad, pero como mi base de datos ya tiene todas las ciudades en otra tabla (normalizada), necesito escribir una subselección en la instrucción insert para buscar la ciudad y escribir su ID, también tengo un procedimiento almacenado para crear GUIDS.

Mi declaración Insert sería algo como esto:

INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES((SELECT NEW_GUID FROM CREATE_GUID), :NAME, (SELECT CITY_ID FROM CITY WHERE NAME = :CITY_NAME)

Sé que es muy fácil escribir una aplicación para hacer esto, pero no me gusta reinventar la rueda, y estoy seguro de que hay algunas herramientas para hacerlo.

¿Pueden darme algún consejo?

Author: dataol, 2008-08-12

14 answers

Es un poco crudo, pero para un solo trabajo, a veces uso Excel.

Si importa el archivo CSV en Excel, puede crear una fórmula que cree una instrucción INSERT mediante la concatenación de cadenas en la fórmula. Por lo tanto, si su archivo CSV tiene 3 columnas que aparecen en las columnas A, B y C en Excel, podría escribir una fórmula como...

= " INSERTAR EN MyTable (Col1, Col2, Col3) VALORES (" & A1 & ", " & B1 & ", " & C1&") "

Entonces usted puede replicar la fórmula abajo de todos sus filas, y copie y pegue la respuesta en un archivo de texto para ejecutarla en su base de datos.

Como digo - es crudo - ¡pero puede ser una manera bastante 'rápida y sucia' de hacer un trabajo!

 102
Author: Chris Roberts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-11 21:07:51

A veces uso El Generador de Código más Simple del Mundo (edición Javascript). Está en línea, pero es solo javascript: sus datos no van a ninguna parte. Sin embargo, también hay una versión asp, con más características.

 13
Author: Blorgbeard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-11 22:12:20

Bueno, si es un CSV, y este es un proceso de una sola vez, abra el archivo en Excel, y luego escriba fórmulas para completar sus datos de la manera que desee, y luego escriba una fórmula Concat simple para construir su SQL, y luego copie esa fórmula para cada fila. Obtendrá un gran número de sentencias SQL que puede ejecutar en cualquier lugar que desee.

 8
Author: Vaibhav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-11 21:02:14

Fabio,

He hecho lo que Vaibhav ha hecho muchas veces, y es una buena manera "rápida y sucia" de obtener datos en una base de datos.

Si necesita hacer esto un par de veces, o en algún tipo de programación, entonces una forma más confiable es cargar los datos CSV "tal cual" en una tabla de trabajo (por ejemplo, customer_dataload) y luego usar instrucciones SQL estándar para rellenar los campos faltantes.

(No conozco la sintaxis de Firebird - pero algo así...)

UPDATE person
SET id = (SELECT newguid() FROM createguid)

UPDATE person
SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)

Etc.

Por lo general, es mucho más rápido (y más confiable) para obtener los datos en la base de datos y luego arreglar los datos que para tratar de arreglar los datos durante la carga. ¡También obtiene el beneficio de las transacciones para permitirle REVERTIR si no funciona!!

 5
Author: Guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-11 21:14:21

Puede importar el archivo CSV en una tabla tal como está, luego escribir una consulta SQL que realice todas las transformaciones necesarias en la tabla importada e inserte el resultado en la tabla de destino.

Algo Así como:

Insertar en target_table

Seleccione t. n, c. city_id como ciudad

De temp_table t, ciudades c

Donde t. city_name = c. city_name

Buen consejo sobre el uso de Excel, pero también sugiero que se sienta cómodo con un lenguaje de scripting como Python, porque para alguna tarea es más fácil escribir un script rápido de Python para hacer el trabajo que tratar de encontrar la función que necesita en Excel o una herramienta pre-hecha que hace el trabajo.

 3
Author: Nickolay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-11 21:13:51

Puedes probar las herramientas fbcopy y fbexport.

 2
Author: idursun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-22 10:26:08

Utilidad en línea muy simple: Convertir de/a CSV

 2
Author: hdoghmen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-25 20:34:37

Utilizo una ligera variación en la técnica de Excel del Globo.

Yo altamente recomiendo descargar el gratis Complemento de ASAP Utilities para Excel. Una de las muchas herramientas que ahorran tiempo que incluyen son las opciones insert before current value y insert after current value.

Estos deberían permitirle llegar a una solución más rápido al ayudarlo a construir sus declaraciones insert.

 1
Author: berberich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:24

Utilice el archivo csv como una tabla externa. Luego puede usar SQL para copiar los datos de la tabla externa a su tabla de destino , con todas las posibilidades de SQL. Véase http://www.firebirdsql.org/index.php?op=useful&id=netzka

 1
Author: Christoph Theuring,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-09 16:48:57

Acaba de terminar este script VBA que podría ser útil para este propósito. Todo lo que debe hacer es cambiar la instrucción Insert para incluir la tabla en cuestión y la lista de columnas (obviamente en la misma secuencia que aparecen en el archivo 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
 1
Author: James C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-30 03:18:35

Puede usar el csvsql libre para hacer esto.

  • Instálelo usando estas instrucciones
  • Ahora ejecute un comando como so para importar sus datos en su base de datos. Más detalles en los enlaces de arriba, pero sería algo así como:

    csvsql --db firebase:///d=mydb --insert mydata.csv

  • Lo siguiente funciona con sqlite, y es lo que uso para convertir datos en un formato fácil de consultar

    csvsql --db sqlite:///dump.db --insert mydata.csv

 1
Author: Brad Parks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-06 14:27:13

Opción 1: 1 - ¿has probado IBExert? IBExpert \ Tools \ Import Data(Versión de prueba o Cliente).

Opción 2: 2-sube tu archivo csv a una tabla temporal con F_BLOBLOAD. 3-crear un procedimiento almacenado, que utiliza 3 funciones (f_stringlength, f_strcopy, f_MID) cruzas toda tu cuerda, tirando de tus campos para construir tu INSERTO.

Enlaces: 2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html

 0
Author: peponloqui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-09 15:47:20

Una herramienta que probé recientemente que funcionó extraordinariamente bien es FSQL.

Escribes un comando de IMPORTACIÓN, lo pegas en FSQL e importa el archivo CSV en la tabla Firebird.

 0
Author: Stan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-01 02:40:57

Haría esto con awk .

Por ejemplo, si tuviera esta información en un archivo CSV:

Bob,New York
Jane,San Francisco
Steven,Boston
Marie,Los Angeles

El siguiente comando le dará lo que desea, ejecute en el mismo directorio que su archivo CSV (llamado name-city.csv en este ejemplo).

$ 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

Escriba awk --help para más información.

 0
Author: Terry Lorber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-15 19:20:18