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?
A veces uso el generador de códigos más simple del mundo (edición Javascript) . Está en línea, pero es solo javascript: tus datos no van a ninguna parte. También hay una versión asp , con más funciones.
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.
Utilidad en línea muy simple: convertir de / a CSV
Utilizo una ligera variación en la técnica de Excel de Balloon.
Recomiendo descargar el complemento gratuito ASAP Utilities para Excel. Una de las muchas herramientas de ahorro de tiempo que incluyen son insertar antes del valor actual e insertar después de las opciones de valor actual .
Esos deberían permitirle llegar a una solución más rápido ayudándolo a construir sus declaraciones de inserción.
opción 1: 1- ¿Has probado IBExert? IBExpert / Tools / Importar datos (versión de prueba o cliente).
opción 2: 2- suba su archivo csv a una tabla temporal con F_BLOBLOAD. 3- crea un procedimiento almacenado, que utilizó 3 funciones (f_stringlength, f_strcopy, f_MID) cruzas toda tu cadena, tirando de tus campos para construir tu INSERT INTO.
enlaces: 2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html
use 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. Ver http://www.firebirdsql.org/index.php?op=useful&id=netzka