Подтвердить что ты не робот

Генерировать операторы вставки SQL из файла CSV

Мне нужно импортировать CSV файл в Firebird, и я потратил пару часов, пробуя некоторые инструменты, и ни один из них не соответствовал моим потребностям.

Основная проблема заключается в том, что все инструменты, которые я пробовал, такие как EMS Data Import и Firebird Data Wizard, ожидают, что мой CSV файл содержит всю информацию, необходимую для моей таблицы.

Мне нужно написать некоторый пользовательский SQL в операторе вставки, например, у меня есть CSV файл с названием города, но, поскольку в моей базе данных уже есть все города в другой таблице (нормализовано), мне нужно написать вложенный выбор во вставке оператор для поиска города и записи его ID, также у меня есть хранимая процедура для создания GUIDS.

Мое выражение вставки будет примерно таким:

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

Как я могу подойти к этому?

4b9b3361

Ответ 1

Это немного грубо - но для одного из рабочих мест, я иногда использую Excel.

Если вы импортируете файл CSV в Excel, вы можете создать формулу, которая создает оператор INSERT, используя конкатенацию строк в формуле. Итак, если ваш CSV файл содержит 3 столбца, которые отображаются в столбцах A, B и C в Excel, вы можете написать формулу, например...

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

Затем вы можете повторить формулу по всем строкам, скопировать и вставить ответ в текстовый файл для запуска в вашей базе данных.

Как я уже сказал - это грубо - но это может быть довольно "быстрый и грязный" способ получить работу!

Ответ 3

Ну, если это CSV, и это одноразовый процесс, откройте файл в Excel, а затем напишите формулы, чтобы заполнить ваши данные так, как вы хотите, а затем напишите простую формулу Concat, чтобы построить свою SQL, а затем скопируйте эту формулу для каждой строки. Вы получите большое количество операторов SQL, которые вы можете выполнять в любом месте.

Ответ 4

Фабио,

Я сделал то, что Вайбхав сделал много раз, и это хороший "быстрый и грязный" способ получить данные в базе данных.

Если вам нужно сделать это несколько раз или по какому-то типу расписания, то более надежным способом является загрузка CSV-данных "как есть" в рабочую таблицу (т.е. customer_dataload), а затем использование стандартных операторов SQL для заполнения отсутствующих полей.

(Я не знаю синтаксиса Firebird, но что-то вроде...)

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

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

и др.

Обычно, это намного быстрее (и более надежно), чтобы получить данные в базе данных, а затем исправить данные, чем пытаться исправить данные во время загрузки. Вы также получаете выгоду от транзакций, чтобы позволить вам ROLLBACK, если он не работает!

Ответ 5

Вы можете импортировать CSV файл в таблицу как есть, а затем написать SQL-запрос, который выполняет все необходимые преобразования в импортированной таблице и вставляет результат в целевую таблицу.

Так что-то вроде:

< (загрузить файл CSV в temp_table - n, city_name) >

Вставить в target_table

выберите t.n, c.city_id как город

из temp_table t, городов c

где t.city_name = c.city_name

Хороший совет об использовании Excel, но я также предлагаю получить удобство с языком сценариев, например Python, потому что для некоторой задачи проще просто написать быстрый python script, чтобы выполнить эту работу, чем пытаться найти нужную вам функцию Excel или готовый инструмент, выполняющий эту работу.

Ответ 7

Вы можете попробовать fbcopy и fbexport.

Ответ 8

Я бы сделал это с помощью awk.

Например, если у вас была эта информация в файле CSV:

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

Следующая команда даст вам то, что вы хотите, запустите в том же каталоге, что и ваш CSV файл (с именем name-city.csv в этом примере).

$ 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

Введите awk --help для получения дополнительной информации.

Ответ 9

Только что закончил этот VBA script, который может быть удобен для этой цели. Все, что нужно сделать, это изменить оператор Insert, чтобы включить соответствующую таблицу и список столбцов (очевидно, в той же последовательности, что и в файле 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

Ответ 10

используйте csv файл в качестве внешней таблицы. Затем вы можете использовать SQL для копирования данных из внешней таблицы в таблицу назначения - со всеми возможностями SQL. См. http://www.firebirdsql.org/index.php?op=useful&id=netzka

Ответ 11

Для этого вы можете использовать бесплатный csvsql.

  • Установите с помощью этих инструкций
  • Теперь запустите команду, чтобы импортировать данные в вашу базу данных. Более подробно по ссылкам выше, но это будет что-то вроде:

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

  • Следующее работает с sqlite, и это то, что я использую для преобразования данных в простой формат запроса

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

Ответ 12

Я использую небольшое изменение в технике Balloon Excel.

Я настоятельно рекомендую скачать бесплатный плагин ASAP Utilities для Excel. Один из многих инструментов для экономии времени, которые они включают, - вставка до текущего значения и вставка после параметров текущего значения.

Это должно помочь вам быстрее найти решение, помогая создавать операторы вставки.

Ответ 13

Инструмент, который я недавно пробовал, который отлично работал, - FSQL.

Вы пишете команду IMPORT, вставьте ее в FSQL и импортируете CSV файл в таблицу Firebird.

Ответ 14

вариант 1: 1- вы попробовали IBExert? IBExpert\Tools\Импорт данных (пробная версия или версия клиента).

вариант 2: 2. Загрузите файл csv во временную таблицу с помощью F_BLOBLOAD. 3- создать хранимую процедуру, в которой использовались 3 функции (f_stringlength, f_strcopy, f_MID) вы пересекаете всю свою строку, потянув за поля, чтобы построить свой INSERT INTO.

ссылки: 2: http://freeadhocudf.org/documentation_english/dok_eng_file.html 3: http://freeadhocudf.org/documentation_english/dok_eng_string.html

Ответ 15

Этот конвертер csv в sql может генерировать все ваши данные csv в запросы вставки MySQL.