Vra

Ek nodig het om die invoer van'n csv-lêer in Firebird en ek het spandeer'n paar uur om te probeer om'n paar tools en daar is niemand wat pas my behoeftes.

Die grootste probleem is dat al die gereedskap wat ek het probeer om soos EBW Data Invoer en Firebird Data Wizard verwag dat my CSV-lêer bevat al die inligting wat nodig is deur my Tafel.

Ek nodig het om te skryf'n paar persoonlike SQL in die insetsel verklaring, byvoorbeeld, ek het'n CSV-lêer met die naam van die stad nie, maar as my databasis reeds het al die stede in ander tafel (genormaliseer), ek nodig het om te skryf'n subselect in die insetsel verklaring te soek vir die stad en skryf sy ID, ook ek het'n gestoor proses te cread GUIDS.

My plaas verklaring sou iets soos hierdie:

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

Hoe kan ek hierdie benadering?

Was dit nuttig?

Oplossing

Dit is'n bietjie ru - maar vir een af werk, het ek soms gebruik Excel.

As jy die invoer van die CSV-lêer in Excel, kan jy skep'n formule wat skep'n INSETSEL verklaring deur gebruik te maak van die string aaneenskakellling in die formule.So - as jou CSV-lêer 3 kolomme wat verskyn in kolomme A, B, en C in Excel, kan jy skryf'n formule soos...

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

Dan kan jy herhaal die formule neer al jou rye, en kopieer en plak die antwoord in'n teks lêer om te hardloop teen jou databasis.

Soos ek sê - dit is ru - maar dit kan nogal'n "vinnige en vuil" manier om'n werk gedoen!

Ander wenke

Wel, as dit is 'n CSV, en dit is dit 'n eenmalige proses, maak die lêer in Excel, en dan skryf formules om jou data te vul in enige manier wat jy wil, en skryf dan 'n eenvoudige Concat formule te bou jou SQL, en dan daardie formule vir elke ry kopieer. Jy sal 'n groot aantal van SQL-stellings wat jy enige plek wat jy wil kan uitvoer nie.

Fabio,

Ek het gedoen wat Vaibhav baie keer gedoen het, en dit is 'n goeie "vinnige en vuil" manier om data te kry in 'n databasis.

As jy nodig het om dit 'n paar keer te doen, of op 'n soort van skedule, dan 'n meer betroubare manier is om die CSV data te laai "as-is" in 'n werk tafel (dit wil sê customer_dataload) en gebruik dan standaard SQL-stellings om die vermiste velde te vul.

(Ek weet nie Firebird sintaksis - maar iets soos ...)

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

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

ens.

Gewoonlik, dit is baie vinniger (en meer betroubare) om die data te kry in die databasis en dan die data as los om te probeer om die data tydens die oplaai te los. Jy kry ook die voordeel van transaksies te kan jy terug draai as dit nie werk nie !!

Jy kan die invoer van die CSV in 'n tabel soos dit is, skryf dan 'n SQL navraag wat al die nodige transformasies doen op die ingevoerde tafel en plaas die resultaat in die teiken tafel.

So iets soos:

  

<(laai die CSV in temp_table - N, CITY_NAME)>

     

voeg in target_table

     

Kies t.n, c.city_id as stad

     

van temp_table t, stede c

     

waar t.city_name = c.city_name

Nice punt oor die gebruik van Excel, maar ek het ook daarop dui raak gemaklik met 'n script taal soos Python, want vir een of ander taak is dit makliker om net te skryf 'n vinnige python script om die werk te doen as om te probeer om die funksie wat jy nodig het in Excel te vind of 'n-pre gemaak instrument wat die werk doen.

gebruik die CSV-lêer as 'n eksterne tafel. Dan kan jy SQL te gebruik om die data van die eksterne tafel kopieer na jou bestemming tafel - met al die moontlikhede van SQL. Sien http://www.firebirdsql.org/index.php?op=useful&id= netzka

Ek sal dit doen met awk .

Byvoorbeeld, as jy hierdie inligting het in 'n CSV-lêer:

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

Die volgende opdrag sal gee wat jy wil, loop in dieselfde gids as jou CSV (vernoem name-city.csv in hierdie voorbeeld).

$ 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

Tik awk --help vir meer inligting.

Net klaar hierdie VBA script wat handig te pas kom vir dié doel kan wees. Almal moet hoef te doen is verander die Insert verklaring aan die tafel in vraag en die lys van kolomme (natuurlik in dieselfde volgorde hulle op die lêer Excel verskyn) in te sluit.

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

Jy kan die gratis csvsql om dit te doen .

  • Installeer dit die gebruik van hierdie instruksies
  • Nou loop 'n bevel soos so na jou data in te voer in jou databasis. Meer besonderhede by die skakels hierbo, maar dit sal so iets wees:

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

  • Die volgende werke met SQLite, en is wat ek gebruik om data te omskep in 'n maklik-formaat te bevraagteken

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

opsie 1: 1- het jy probeer IBExert? IBExpert \ Tools \ Invoer Data (Trial of kliënt weergawe).

opsie 2: 2- laai jou CSV om 'n tydelike tabel met F_BLOBLOAD. 3- skep 'n gestoor proses, wat 3 funksies gebruik (f_stringlength, f_strcopy, f_MID) jy steek jou hele string, trek jou velde om jou te voeg in te bou.

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

'n instrument Ek het onlangs probeer wat gewerk het uitstekend is FSQL .

Jy skryf 'n invoer opdrag, plak dit in FSQL en dit voer die CSV in die Firebird tafel.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top