online leer importar ejemplos convertir cargar archivo sql csv insert firebird

leer - Generar instrucciones SQL de inserción desde un archivo csv



leer csv sql (14)

Necesito importar un archivo csv a 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 intentado, como EMS Data Import y Firebird Data Wizard, esperan que mi archivo csv contenga toda la información que necesita mi Table.

Necesito escribir algunos SQL personalizados en la instrucción de inserción, 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 el inserto para buscar la ciudad y escribir su ID, también tengo un procedimiento almacenado para crear GUIDS.

Mi declaración de inserción 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 algunos consejos?



Acabo 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 en 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


Bueno, si se trata de un archivo 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 forma que desee, y luego escriba una fórmula simple de Concat para construir su SQL, y luego copia esa fórmula para cada fila. Obtendrá una gran cantidad de declaraciones SQL que puede ejecutar en cualquier lugar que desee.


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

Si importa el archivo CSV a Excel, puede crear una fórmula que cree una instrucción INSERT usando la concatenación de cadenas en la fórmula. Entonces, 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 ...

= "INSERT INTO MyTable (Col1, Col2, Col3) VALUES (" & A1 & "," & B1 & "," & C1 & ")"

Luego puede replicar la fórmula en todas sus filas, y copiar y pegar la respuesta en un archivo de texto para ejecutarla en su base de datos.

Como dije, es crudo, pero puede ser una forma bastante "rápida y sucia" de hacer un trabajo.


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 varias veces, o en algún tipo de programa, entonces una forma más confiable es cargar los datos CSV "tal cual" en una tabla de trabajo (es decir, carga_datos_datos) y luego usar sentencias SQL estándar para rellenar el campos faltantes

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

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) ingresar los datos en la base de datos y luego corregir los datos que tratar de corregir los datos durante la carga. ¡También obtienes el beneficio de las transacciones para permitirte ROLLBACK si no funciona!


Haría esto con awk .

Por ejemplo, si tenía 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.



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

Entonces algo así como:

<(cargar el archivo CSV en temp_table - n, city_name)>

insertar en target_table

seleccione tn, c.city_id como ciudad

de temp_table t, ciudades c

donde t.city_name = c.city_name

Un buen consejo sobre el uso de Excel, pero también sugiero que te sientas cómodo con un lenguaje de scripting como Python, porque para algunas tareas es más fácil escribir un script de Python para hacer el trabajo que tratar de encontrar la función que necesitas en Excel o herramienta hecha que hace el trabajo.


Puede usar el csvsql libre para hacer esto.

  • Instálalo usando estas instrucciones
  • Ahora ejecuta un comando como ese para importar tus datos en tu 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


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

Escribe un comando IMPORTAR, lo pega en FSQL e importa el archivo CSV en la tabla Firebird.