我需要将一个csv文件导入 Firebird ,我花了几个小时尝试一些工具,但没有一个适合我的需要。
主要问题是,我一直在尝试的所有工具EMS Data Import和Firebird 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)
我该如何处理?
答案 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执行此操作。
现在运行这样的命令将数据导入数据库。上面链接的更多细节,但它类似于:
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(
...
);