从CSV文件生成插入SQL语句

时间:2008-08-11 20:59:12

标签: sql csv insert firebird

我需要将一个csv文件导入 Firebird ,我花了几个小时尝试一些工具,但没有一个适合我的需要。

主要问题是,我一直在尝试的所有工具EMS Data ImportFirebird Data Wizard都希望我的CSV文件包含我的表格所需的所有信息。

我需要在insert语句中编写一些自定义SQL,例如,我有一个带有城市名称的CSV文件,但由于我的数据库已经包含了另一个表中的所有城市(规范化),我需要编写一个子选择在insert语句中查找城市并写入其ID,我也有一个存储过程来创建GUID。

我的插入语句是这样的:

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

我该如何处理?

12 个答案:

答案 0 :(得分:106)

这有点粗糙 - 但对于一次性工作,我有时会使用Excel。

如果将CSV文件导入Excel,则可以创建一个公式,该公式通过在公式中使用字符串连接来创建INSERT语句。那么 - 如果您的CSV文件有3列出现在Excel中的A,B和C列中,您可以编写一个类似...的公式。

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

然后,您可以将所有行复制到公式中,然后将答案复制并粘贴到文本文件中以对数据库运行。

就像我说的那样 - 它很粗糙 - 但它可以是一种'快速而肮脏'的方式来完成工作!

答案 1 :(得分:8)

好吧,如果它是一个CSV,这是一次性过程,在Excel中打开文件,然后编写公式以您想要的任何方式填充数据,然后编写一个简单的Concat公式来构建您的SQL,然后为每一行复制该公式。您将获得大量可以在任何地方执行的SQL语句。

答案 2 :(得分:5)

法比奥,

我已经完成了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)

通常,将数据输入数据库然后修复数据比在上载期间尝试修复数据要快得多(并且更可靠)。你也可以获得交易的好处,如果它不起作用你就可以回滚!

答案 3 :(得分:3)

您可以将CSV文件按原样导入到表中,然后编写一个SQL查询,在导入的表上执行所有必需的转换,并将结果插入到目标表中。

类似于:

  

<(将CSV文件加载到temp_table - n,city_name)>

     

插入target_table

     

选择t.n,c.city_id作为城市

     

来自temp_table t,cities c

     

其中t.city_name = c.city_name

关于使用Excel的好建议,但我也建议熟练使用像Python这样的脚本语言,因为对于某些任务来说,编写一个快速的python脚本来完成工作比尝试在Excel中找到所需的函数更容易。一个预制的工具,可以完成这项工作。

答案 4 :(得分:1)

我会使用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了解详情。

答案 5 :(得分:1)

刚刚完成这个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

答案 6 :(得分:1)

将csv文件用作外部表。然后,您可以使用SQL将数据从外部表复制到目标表 - 具有SQL的所有可能性。 见http://www.firebirdsql.org/index.php?op=useful&id=netzka

答案 7 :(得分:1)

您可以使用免费csvsql执行此操作。

  • 安装using these instructions
  • 现在运行这样的命令将数据导入数据库。上面链接的更多细节,但它类似于:

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

  • 以下适用于sqlite,是我用来将数据转换为易于查询的格式

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

答案 8 :(得分:1)

2020 中为我提供帮助的两个在线工具:

https://numidian.io/convert/csv/to/sql

https://www.convertcsv.com/csv-to-sql.htm

第二个是基于JS的,并且不会上传您的数据(至少在我撰写本文时不是这样)

答案 9 :(得分:0)

我最近尝试过的效果非常出色的工具是FSQL

您编写IMPORT命令,将其粘贴到FSQL,然后将CSV文件导入Firebird表。

答案 10 :(得分:0)

选项1: 1-你试过IBExert吗? IBExpert \ Tools \导入数据(试用版或客户版)。

选项2: 2-使用F_BLOBLOAD将csv文件上传到临时表。 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

答案 11 :(得分:0)

您可以使用shell

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(
...
);