我们有这种格式的记录:
99 0882300 25 YATES ANTHONY V MAY 01 12 04 123456 12345678
宽度是固定的,我们需要将其导入SQL。我们尝试了批量导入,但它不起作用,因为它不是','或'\ t'分开。它在文本文件中由各个长度的单独空格分隔,这是我们的困境所在。
有关如何处理此问题的任何建议?谢谢!
答案 0 :(得分:7)
问题相当陈旧,但可能仍然具有相关性。
我和你有完全相同的问题。 我的解决方案是使用BULK INSERT和FORMAT文件。
这将允许您:
要切入追逐,这是我的数据格式(即一行)
import android.annotation.AnimRes;
import android.annotation.InterpolatorRes;
这是我的SQL代码:
608054000500SS001 ST00BP0000276AC024 19980530G10379 00048134501283404051N02912WAC 0024 04527N05580WAC 0024 1998062520011228E04ST 04856 -94.769323 26.954832
-94.761114 26.953626G10379 183 1
请注意那里设置的ROWTERMINATOR参数和DATAFILETYPE。
这是格式文件
BULK INSERT dbo.TARGET_TABLE
FROM 'file_to_upload.dat'
WITH (
BATCHSIZE = 2000,
FIRSTROW = 1,
DATAFILETYPE = 'char',
ROWTERMINATOR = '\r\n',
FORMATFILE = 'formatfile.Fmt'
);
我在下面放了文档链接,但必须注意的内容如下:
额外注意:在我的情况下,我只需要三个字段,所以中间的东西我只是调用" spacer",并且在我的格式文件中被忽略(你在第6列中更改数字,请参阅文档)。
希望它能满足您的需求,对我来说很好。 干杯
此处的文档: https://msdn.microsoft.com/en-us/library/ms178129.aspx https://msdn.microsoft.com/en-us/library/ms187908.aspx
答案 1 :(得分:6)
当您感觉更喜欢使用SQL而不是导入工具时,您可以将文件批量导入到临时表中的单个VARCHAR(255)列中。然后使用SQL处理所有记录并将它们转换为目标表:
CREATE TABLE #DaTable(MyString VARCHAR(255))
INSERT INTO #DaTable(MyString) VALUES ('99 0882300 25 YATES ANTHONY V MAY 01 12 04 123456 12345678')
INSERT INTO FInalTable(Col1, Col2, Col3, Name)
SELECT CAST(SUBSTRINg(MyString, 1, 3) AS INT) as Col1,
CAST(SUBSTRING(MyString, 4, 7) AS INT) as Col2,
CAST(SUBSTRING(MyString, 12, 3) AS INT) as Col3,
SUBSTRING(MyString, 15, 6) as Name
FROM #DaTable
result: 99 882300 25 YATES
答案 2 :(得分:0)
我曾经为客户做过一段时间,而且看起来很难过,Microsoft Access是满足他需求的最佳工具。它支持烘焙的固定宽度文件。
除此之外,您正在编写一个脚本,将文件的行转换为SQL在插入/更新语句中可以理解的内容。
在Ruby中,您可以使用String#slice方法,它采用索引和长度,就像固定宽度文件的定义通常用表达式一样。读取文件,解析行,然后将其写回作为SQL语句。
答案 3 :(得分:0)
从TXT导入到SQL:
CREATE TABLE #DaTable(MyString VARCHAR(MAX));
BULK INSERT #DaTable FROM'C:\用户\乌苏... IDA_S.txt” 蒙山 ( CODEPAGE ='RAW' )
答案 4 :(得分:0)
改为使用SSIS。 这更加清晰,并且为导入(文本)文件提供了多种选择