将固定宽度的 UTF-8 文件导入 SQL 2008R2,可变文件名
Posted
技术标签:
【中文标题】将固定宽度的 UTF-8 文件导入 SQL 2008R2,可变文件名【英文标题】:Import fixed width UTF-8 file into SQL 2008R2, variabel file names 【发布时间】:2013-06-18 07:35:38 【问题描述】:我必须将不同名称的文本文件(如下所示)导入 SQL Server 2008。
-
XYZ0000746263.txt
XYZ0000746269.txt
XYZ0000745860.txt
文件名总是以 XYZ 开头,并且数字总是比之前的文件大。
文件格式为等宽,UTF-8编码。
SHINST 1020130613
SHINSD0745860182650 940PI67100000 dataw11 2012CH 01002601900100 848CRU
SHINSD0745860182650 940PI67066900 dataa12 9434CH 00701801400030 848CRU
SHINSD0745860182650 940PI67160300 adsfaf13 1205CH 04203601000160 848CRU
SHINSD0745860182650 940PI67171300 data 14 1205CH 01803501200120 848ND1
SHINSD0745860182650 940PI67079000 asdfs15 8400CH 00702601400040 848ND1
SHINSD0745860182620 940PI67053900 data 16 6877CH 01904101100130 848ND1
SHINSD0745860182620 940PI67156100 text 17 3003CH 08906202902460 848ND2
SHINSD0745860182650 940PI67110700 alskdjf18 1000CH 02603900900130 848ND2
SHINSD0745860182620 940PI67123900 asfasdffa19 8048CH 01502300900020 848ND2
SHINSD0745860182650 940PI67066300 data 20 8952CH 01002601900090 848ND2
SHINSF000012
第一行包含SHINST
,然后是文件中的记录数,然后是YYYYMMDD
格式的日期。
记录包含SHINSD
,然后是一个 13 位数字,然后是固定宽度的记录。
最后一行包含SHINSF
,然后是一个包含文件总行数的六位数字。
我想自动将这种格式的文件导入到 SQL 表中。怎么办?
【问题讨论】:
【参考方案1】:你可以试试:
BULK INSERT tablename FROM 'c:\File.txt' WITH (FIELDTERMINATOR = ' ')
如果 ' '(空格)是您的字段分隔符。 当然表表名列必须与文件中的列相同(计数和长度)。 您可以创建一个过程并只给它一个文件名路径,如这些exaples
唯一的问题是文件中的第一行和最后一行,因为它们不同,我不知道您是否需要插入 mas。如果你需要忽略它们,也许你需要一个脚本来消除它们。
【讨论】:
我需要每个数据记录行第一行的日期,以了解数据记录何时发送给我。记录集是用固定宽度的数据建立起来的,我可以在这篇文章中以正确的方式展示它。 这可以用 bash 脚本来完成,为BULK INSERT
准备文件,但如果你想在SQL
中完成这一切,我建议你在# 中创建一个过程并转储文件temptable(tempfield(nvarchar(max))) 在里面。您可以进行各种字符串操作,例如 select top 1
和 substing 以将该日期转换为变量,而不是准备插入其余字段并在您想要的字段上添加时间戳...
也许你有一个例子给我,因为我是初学者...... :-)以上是关于将固定宽度的 UTF-8 文件导入 SQL 2008R2,可变文件名的主要内容,如果未能解决你的问题,请参考以下文章
使用 Powershell 从 SQL Server 2008 R2 导出到固定宽度的文本文件