从csv文件生成插入SQL语句
我需要导入一个csv文件到Firebird ,我花了几个小时尝试一些工具,没有符合我的需求。
主要的问题是我一直在尝试的工具,如EMS数据导入和Firebird数据向导,希望我的CSV文件包含我的表所需的所有信息。
我需要在插入语句中编写一些自定义SQL,例如,我有一个城市名称的CVS文件,但由于我的数据库已经在另一个表(标准化)中的所有城市,我需要在插入声明来查找这个城市,并写下它的ID,我也有一个存储过程来cread 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)
我知道编写一个应用程序来做这件事非常容易,但我不喜欢重新发明轮子,而且我确信有一些工具可以做到这一点。
你们能给我一些build议吗?
这有点粗糙 – 但是对于一个工作,我有时会使用Excel。
如果将CSV文件导入到Excel中,则可以通过在公式中使用string连接来创build一个可以创buildINSERT语句的公式。 所以 – 如果你的CSV文件有3列出现在Excel中的列A,B和C中,你可以写一个公式如…
=“INSERT INTO MyTable(Col1,Col2,Col3)VALUES(”&A1&“,”&B1&“,”&C1&“)”
然后,可以将公式复制到所有行中,然后将答案复制并粘贴到文本文件中,以针对数据库运行。
就像我说的 – 这很粗鲁 – 但是完成工作可能是一种“快捷而肮脏”的方式!
我有时使用世界上最简单的代码生成器(Javascript版本) 。 它在线,但它只是JavaScript – 你的数据不会去任何地方。 也有一个ASP版本,但有更多的function。
那么,如果它是一个CSV,并且这是一次性的过程,那么在Excel中打开这个文件,然后编写公式来以任何你想要的方式填充你的数据,然后编写一个简单的Concat公式来构造你的SQL,然后为每一行复制该公式。 你会得到大量的SQL语句,你可以在任何你想要的地方执行。
法比奥,
我已经完成了Vaibhav多次完成的任务,将数据导入数据库是一种很好的“快速而肮脏”的方法。
如果您需要这样做几次,或者某种types的计划,那么更可靠的方法是将CSV数据“按原样”加载到工作表(即customer_dataload)中,然后使用标准SQL语句来填充缺less字段。
(我不知道Firebird的语法 – 但是像…)
UPDATE person SET id = (SELECT newguid() FROM createguid) UPDATE person SET cityid = (SELECT cityid FROM cities WHERE person.cityname = cities.cityname)
等等
通常,将数据导入数据库然后修复数据比在上载过程中尝试修复数据要快得多(也更可靠)。 您还可以获得交易的好处,如果它不起作用,则允许您进行ROLLBACK操作!
您可以按照原样将CSV文件导入到表中,然后编写一个SQL查询,在导入的表上执行所有必需的转换,并将结果插入到目标表中。
所以像这样:
<(将CSV文件加载到temp_table -n,city_name)>
插入到target_table中
selecttn,c.city_id作为城市
从temp_table t,城市c
其中t.city_name = c.city_name
关于使用Excel的好的提示,但我也build议适应像Python这样的脚本语言,因为对于某些任务来说,只需编写一个快速的Python脚本来完成这项工作比试图在Excel中find所需的function更容易,做了这个工作的工具。
你可以试试fbcopy和fbexport工具。
非常简单的在线实用程序: 从/转换为CSV
我使用气球的Excel技术略有变化。
我强烈build议下载Excel的免费 ASAP Utilities插件。 他们所包含的许多节省时间的工具之一是在当前值之前 插入并在当前值选项之后插入 。
这些应该让你更快地达成解决scheme,帮助你build立你的插入语句。
使用csv文件作为外部表。 然后,您可以使用SQL将外部表中的数据复制到目标表 – 具有SQL的所有可能性。 请参阅http://www.firebirdsql.org/index.php?op=useful&id=netzka
刚刚完成这个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:1-你有没有试过IBExert? IBExpert \ Tools \导入数据(试用或客户版本)。
选项2:2-使用F_BLOBLOAD将您的csvfile upload到临时表。 3-创build一个存储过程,使用3个函数(f_stringlength,f_strcopy,f_MID)将所有的string交叉,将您的字段拖动到您的INSERT INTO中。
链接:2: http : //freeadhocudf.org/documentation_english/dok_eng_file.html 3: http : //freeadhocudf.org/documentation_english/dok_eng_string.html
我最近尝试过的工具非常出色,就是FSQL 。
您编写一个IMPORT命令,将其粘贴到FSQL
,并将CSV文件导入到Firebird表中。
我会用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
以获取更多信息。
你可以使用免费的csvsql来做到这一点。
- 使用这些说明安装它
-
现在运行一个像这样的命令来将数据导入到数据库中。 更多的细节在上面的链接,但它会是这样的:
csvsql --db firebase:///d=mydb --insert mydata.csv
-
下面的工作与sqlite,是我用来将数据转换成一个易于查询的格式
csvsql --db sqlite:///dump.db --insert mydata.csv