Генерация операторов 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)

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

11.08.2008 20:59:11
Я иногда использую самый простой в мире генератор кода (издание Javascript) . Это онлайн, но это просто javascript - ваши данные никуда не денутся. Также есть версия asp , с большим количеством функций.
Blorgbeard is out 11.08.2008 22:12:20
Я использую небольшое изменение в технике Balloon Excel . Я настоятельно рекомендую скачать бесплатный плагин ASAP Utilities для Excel. Один из многих инструментов для экономии времени, которые они включают, - вставка до текущего значения и вставка после параметров текущего значения . Те должны позволить вам прийти к решению
berberich 12.08.2008 03:22:10
Очень простая онлайн-утилита: Конвертировать из / в CSV
hdoghmen 25.03.2015 20:34:37
Отлично, некоторые вопросы о десятичных типах.
Kiquenet 3.03.2017 09:51:12
Лучший инструмент для конвертации: codebeautify.org/csv-to-sql-converter
ahgood 27.04.2017 04:50:05
12 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

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

113
20.04.2019 17:20:44
Вы также можете открыть файл с помощью подходящего редактора (например, vim) и применить быстрый макрос к каждой строке.
Luc M 9.03.2011 17:44:48

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

8
11.08.2008 21:02:14

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

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

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

вставить в target_table

выберите tn, c.city_id в качестве города

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

где t.city_name = c.city_name

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

3
11.08.2008 21:13:51

Фабио,

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

Если вам нужно сделать это несколько раз или по расписанию определенного типа, то более надежным способом является загрузка данных 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)

и т.п.

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

5
11.08.2008 21:14:21

Я бы сделал это с помощью 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для получения дополнительной информации.

1
15.04.2016 19:20:18
Это невероятно бесполезно. Несколько секунд вашего времени, потраченного на быстрый и грязный пример, спасут человека, который не знает, как использовать awk, несколько часов.
Anthony 22.08.2014 16:55:21

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

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

0
1.01.2013 02:40:57

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

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

Вариант 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

0
9.03.2011 15:47:20

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

1
9.03.2011 16:48:57
+1 за упоминание внешних таблиц, но учтите, что ваши данные должны быть в записях и полях фиксированной длины как CHAR(n), и вам нужны GRANTпривилегии, и вам нужно разрешить доступ к файлам при firebird.confиспользовании ExternalFileAccess = Fullи DatabaseAccess = Full.
Lumi 4.06.2012 14:42:27

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

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

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

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

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

1
6.03.2017 14:27:13

Я бы посоветовал вам проверить Data Transformer (отказ от ответственности - я его разработчик). Это приложение может конвертировать CSV (и другие форматы) в SQL. SQL содержит операторы вставки для каждой строки. Также есть опция для генерации оператора «создать таблицу».

Приложение работает в автономном режиме. Ваши данные никогда не покидают ваш компьютер.

Вы можете получить его из Mac App Store или Microsoft Store .

1
22.02.2020 05:10:23

вы можете использовать оболочку

sed "s/,/','/g" file.csv > tmp
sed "s/$/'),(/g" tmp > tmp2
sed "s/^./'&/g" tmp2 > insert.sql

а затем добавить

INSERT INTO PERSON (ID, NAME, CITY_ID) VALUES(
...
);
0
17.04.2020 14:56:04