Generowanie poleceń Insert SQL z pliku csv

Muszę zaimportować plik csv do Firebird i spędziłem kilka godzin testując niektóre narzędzia i żadne nie pasują do moich potrzeb.

Głównym problemem jest to, że wszystkie narzędzia, które próbowałem jak Import danych EMSi Firebird Data Wizardoczekują, że mój plik csv zawiera wszystkie informacje potrzebne do mojej tabeli.

Muszę napisać jakiś Niestandardowy SQL w instrukcji insert, na przykład mam plik cvs z nazwą miasta, ale jako moja baza danych już ma wszystkie miasta w innej tabeli (znormalizowane), muszę napisać podwybór w instrukcji insert szukać dla miasta i napisać jego ID, również mam procedurę składowaną cread GUIDS.

Moja wstawka będzie mniej więcej taka:

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

Wiem, że bardzo łatwo jest napisać aplikację, aby to zrobić, ale nie lubię odkrywać koła na nowo i jestem pewien, że istnieją pewne narzędzia, aby to zrobić.

Możecie mi coś doradzić?
Author: dataol, 2008-08-12

14 answers

To trochę prymitywne - ale do jednorazowych zadań czasem używam Excela.

Jeśli zaimportujesz plik CSV do programu Excel, możesz utworzyć formułę, która utworzy instrukcję INSERT za pomocą konkatenacji łańcuchowej w formule. Tak więc - jeśli Twój plik CSV ma kolumny 3, które pojawiają się w kolumnach a, B I C w programie Excel, możesz napisać formułę podobną...

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

Wtedy można odtworzyć formułę w dół wszystkich twoje wiersze, a następnie skopiuj i wklej odpowiedź do pliku tekstowego, aby uruchomić się z bazą danych.

Jak mówię-to prymitywne-ale to może być dość "szybki i brudny" sposób wykonania pracy!

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-11 21:07:51

Czasami używam najprostszego na świecie generatora kodu (edycja Javascript). Jest online, ale to tylko javascript - Twoje dane nigdzie nie idą. Istnieje również wersja asp , z większą ilością funkcji.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-11 22:12:20

Cóż, jeśli jest to plik CSV i jest to jednorazowy proces, otwórz plik w Excelu, a następnie napisz formuły, aby wypełnić dane w dowolny sposób, a następnie napisz prostą formułę Concat, aby skonstruować swój SQL, a następnie skopiuj tę formułę dla każdego wiersza. Otrzymasz dużą liczbę poleceń SQL, które możesz wykonać w dowolnym miejscu.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-11 21:02:14

Fabio,

Zrobiłem to, co Vaibhav zrobił wiele razy, i jest to dobry "szybki i brudny" sposób, aby uzyskać dane do bazy danych.

Jeśli musisz to zrobić kilka razy lub w jakimś harmonogramie, bardziej niezawodnym sposobem jest załadowanie danych CSV" as-is " do tabeli roboczej (np. customer_dataload), a następnie użycie standardowych poleceń SQL do wypełnienia brakujących pól.

(nie znam składni Firebird - ale coś w tym stylu...)

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

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

Itd.

Zazwyczaj jest to dużo szybciej (i bardziej niezawodnie), aby uzyskać dane do bazy danych, a następnie naprawić dane, niż próbować naprawić dane podczas przesyłania. Otrzymujesz również korzyści z transakcji, aby umożliwić wycofanie, jeśli nie zadziała!!

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-11 21:14:21

Możesz zaimportować plik CSV do tabeli w takim stanie, w jakim jest, a następnie napisać zapytanie SQL, które wykona wszystkie wymagane przekształcenia zaimportowanej tabeli i wstawi wynik do tabeli docelowej.

Więc coś w stylu:

Insert into target_table

Wybierz t. n, c. city_id jako miasto

From temp_table t, cities c

Gdzie T. city_name = c. city_name

Nice tip o korzystaniu z Excela, ale sugeruję również, aby czuć się komfortowo z językiem skryptowym, takim jak Python, ponieważ dla niektórych zadań łatwiej jest po prostu napisać szybki skrypt Pythona, aby wykonać zadanie, niż próbować znaleźć potrzebną funkcję w Excelu lub gotowe narzędzie, które wykonuje zadanie.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-11 21:13:51

Możesz wypróbować narzędzia fbcopyi 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/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-22 10:26:08

Bardzo proste narzędzie online: Konwersja z / do 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-25 20:34:37

Używam lekkiego wariantu na temat techniki Excela Balona .

I wysoce polecam ściągnięcie za darmo wtyczka ASAP Utilities dla programu Excel. Jednym z wielu narzędzi oszczędzających czas są insert przed bieżącą wartością i insert po bieżącej wartości opcje.

Powinny one pozwolić ci szybciej znaleźć rozwiązanie, pomagając w budowaniu instrukcji 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:24

Użyj pliku csv jako zewnętrznej tabeli. Następnie możesz użyć SQL do skopiowania danych z tabeli zewnętrznej do tabeli docelowej - ze wszystkimi możliwościami SQL. Zobacz 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 16:48:57

Właśnie skończyłem skrypt VBA, który może być przydatny do tego celu. Wystarczy zmienić instrukcję Insert tak, aby zawierała daną tabelę i listę kolumn (oczywiście w tej samej kolejności, co w pliku 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-30 03:18:35

Możesz użyć darmowego csvsql .

  • zainstaluj go używając tych instrukcji
  • Teraz uruchom polecenie tak, aby zaimportować dane do bazy danych. Więcej szczegółów pod linkami powyżej, ale byłoby to coś w stylu:

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

  • Poniższe działa z sqlite i jest tym, czego używam do konwersji danych do łatwego do zapytania formatu

    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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-06 14:27:13

Opcja 1: 1-Czy próbowałeś IBExert? IBExpert \ Tools \ Import danych (wersja próbna lub Wersja klienta).

Opcja 2: 2-Prześlij plik csv do tymczasowej tabeli za pomocą F_BLOBLOAD. 3-Utwórz procedurę składowaną, która wykorzystywała 3 Funkcje (f_stringlength, f_strcopy, f_MID) krzyżujesz cały łańcuch, ciągnąc pola, aby zbudować wkładkę.

Linki: 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 15:47:20

Ostatnio wypróbowałem narzędzie, które zadziałało znakomicie, to FSQL .

Piszesz polecenie IMPORT, wklejasz je do FSQL i importuje plik CSV do tabeli 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-01 02:40:57

Zrobiłbym to z awk .

Na przykład, jeśli masz tę informację w pliku CSV:

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

Poniższe polecenie da ci to, co chcesz, uruchom w tym samym katalogu co plik CSV (o nazwie name-city.csv w tym przykładzie).

$ 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

Wpisz awk --help aby uzyskać więcej informacji.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 19:20:18