2008-08-11 10 views
42

Necesito importar un archivo csv al Firebird y he pasado un par de horas probando algunas herramientas y ninguna se ajusta a mis necesidades.Generar Insertar declaraciones SQL desde un archivo csv

El problema principal es que todas las herramientas que he estado tratando como EMS Data Import y Firebird Data Wizard esperan que mi csv archivo contiene toda la información necesaria por mi mesa.

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

Mi Insertar declaració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 de escribir una aplicación para hacer esto, pero no me gusta que reinventar la rueda, y estoy Seguro que hay algunas herramientas para hacerlo.

¿Pueden darme algunos consejos?

Respuesta

97

Es un poco tosco, pero para algunos trabajos, a veces uso Excel.

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

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

entonces se puede replicar la fórmula hacia abajo todas sus filas, y copiar y pegar la respuesta en un archivo de texto para funcionar en contra de su base de datos.

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

+1

Esto es mucho mejor que la técnica de cálculo de Excel que yo estaba usando! ¡Gracias! – Liam

+2

También puede abrir el archivo con un editor decente (por ejemplo, vim) y aplicar una macro rápida en cada línea. –

8

Bueno, si se trata de 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á una gran cantidad de declaraciones SQL que puede ejecutar en cualquier lugar que desee.

3

Puede importar el archivo CSV en una tabla 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.

Así que algo como:

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

inserción en target_table

seleccione t.n, c.city_id como la ciudad

desde t temp_table, ciudades c

donde t.city_name = c.city_name

buen consejo sobre el uso de Excel, pero también sugeriría conseguir cómodo con un lenguaje de programación como Python, porque para algunas tareas es más fácil simplemente escribir un script de Python rápido para hacer el trabajo que tratar de encontrar la función que necesita en Excel o una herramienta prefabricada que hace el trabajo.

5

Fabio,

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

Si necesita hacer esto algunas 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, customer_dataload) y luego usar SQL estándar declaraciones para poblar los campos faltantes.

(no sé la sintaxis Firebird - sino 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 fiable) para obtener los datos en la base de datos y luego corrige los datos que intentar corregir los datos durante la carga. ¡También obtienes el beneficio de las transacciones para permitirte ROLLBACK si no funciona!

12

veces uso The World's Simplest Code Generator (Javascript edition). Está en línea, pero es solo javascript: tus datos no van a ninguna parte. También hay un asp version, con más funciones.

+0

Utilicé una variación de eso (básicamente añadí un poco de código personalizado para hacer la mayor parte del masaje de datos que necesitaba mi caso) y se me ocurrió una solución de plantillas que me ahorra literalmente horas cada vez que tengo que volver a llenar las tablas. Estoy trabajando en ... obtener datos de Excel, por cierto. – schonarth

+0

¿Cómo es la expresión regular en esas herramientas para generar *** Insert ***? – Kiquenet

0

me gustaría hacer esto con awk.

Por ejemplo, si usted 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 quiere, se ejecutan en el mismo directorio que el 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 

Tipo awk --help para obtener más información.

+3

Esto es increíblemente inútil. Unos pocos segundos de su tiempo dedicado a hacer un ejemplo rápido y sucio ahorrarían a alguien que no sabe cómo usar awk varias horas. – Anthony

2

Usted podría intentar fbcopy y fbexport herramientas.

+0

¿Esta respuesta está relacionada con la pregunta? El enlace dice * fbcopy *: Herramienta para copiar y comparar datos en las bases de datos de Firebird – hdoghmen

0

Una herramienta Recientemente he probado que funcionó extraordinariamente bien es FSQL.

Escribe un comando IMPORTAR, péguelo en FSQL e importa el archivo CSV en la tabla Firebird.

1

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). opción

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 
0

1: 1- han intentado 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

1

utilizan el CSV-archivo 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

+0

+1 para mencionar tablas externas, pero tenga en cuenta que debe tener sus datos en registros de longitud fija y campos como 'CHAR (n)', y usted necesita 'GRANT' el privilegio, y debe permitir el acceso al archivo en' firebird.conf' usando 'ExternalFileAccess = Full' y' DatabaseAccess = Full'. – Lumi

2

muy sencilla utilidad en línea: Convert from/to CSV

+0

Genial, algunos problemas con los tipos decimales. – Kiquenet

+0

Una mejor herramienta de conversión: http://codebeautify.org/csv-to-sql-converter – ahgood

0

Puede utilizar la conexión csvsql para hacer esto.

  • instalarlo using these instructions
  • Ahora ejecute un comando al igual que para importar los 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

  • Los siguientes trabajos con SQLite, y es lo que utilizo para convertir los datos en una herramienta fácil de consultar formato

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

Cuestiones relacionadas