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

Разобрался с некоторыми подсказками @basarat. Должен быть явный возврат для первого результата, а не цикл for: return querySnapshot.docs[0].id;. Полная измененная функция ниже:

async function addParticipant(email_address: string) {
    try {
        console.log("Querying for person");
        const query = await db.collection('people')
            .where('emails', 'array-contains', email_address)
            .limit(1);
        const querySnapshot = await query.get();
        if (!querySnapshot.empty) {
            console.log("Document exists for email " + email_address);
            return querySnapshot.docs[0].id;
        } else {
            console.log("Creating person with " + email_address);
            const fields = {emails: [email_address]};
            try {
                const docRef = await db.collection('people').add(fields);
                console.log("New document id: " + docRef.id);
                const document_id = docRef.id;
                return document_id;
            } catch (err) {
                console.log("Error adding document:", err);
            }
        }
    } catch (err) {
        console.log("Error getting document:", err);
    }
};
53
задан halfer 20 April 2019 в 07:57
поделиться

7 ответов

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

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

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

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

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

107
ответ дан double-beep 7 November 2019 в 08:29
поделиться

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

8
ответ дан Vaibhav 7 November 2019 в 08:29
поделиться

Fabio,

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

, Если необходимо сделать это несколько раз, или на некотором типе расписания, тогда более надежный путь состоит в том, чтобы загрузить данные 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
ответ дан Guy 7 November 2019 в 08:29
поделиться

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

Так что-то как:

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

вставляют в t.n выбора target_table

, c.city_id как город

от temp_table t, города c

, где t.city_name = c.city_name

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

3
ответ дан Nickolay 7 November 2019 в 08:29
поделиться

Я сделал бы это с 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
ответ дан Terry G Lorber 7 November 2019 в 08:29
поделиться

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

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

0
ответ дан 7 November 2019 в 08:29
поделиться

Только что закончил этот скрипт VBA, который может быть полезен для этой цели. Все, что нужно сделать, это изменить оператор 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
1
ответ дан 7 November 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: