SQL导入文本文件

时间:2017-11-02 06:29:54

标签: sql sql-server import sql-server-2012

G'全部

我有一个文件夹会定期将文件文件转储到其中,我试图将其导入到单个SQL表中。 文本文件的基本格式如下:

[DATA]
Test: 12345
Test type: Random Test Information - Not Important
Test date: 01/10/2010
Test time: 12:00:00

Channel number: 1
Rate: 12.345 kN/min
Start load: 12.345 kN
Stop load: 12 %
Area: 12345.678 mm²

[RESULTS]
END TEST STOP
Maximum load: 12.345 kN
Maximum strength: 1.234 MPa

[GRAPHINFO]
Axis0=6;0;60;0;0;0
Axis1=3;0.000;25.000;255;0;65535
Graph1=0;1

[GRAPH]
Time [sec]  Load [kN]
0.050   0.123
0.100   0.456
0.150   0.789
0.200   1.123
0.250   1.456
0.300   1.789
0.350   2.123
0.400   2.456
0.450   2.789
0.500   3.123
0.550   3.456

[CHECKSUM]
123ABC4D

'图表'部分的长度可能不同,因此解决方案需要知道何时停止。

我想要导入的数据是

  • 测试
  • 测试日期
  • 测试时间
  • 负载率
  • 开始加载
  • 停止加载
  • 最大负荷
  • 最大强度
  • 图表数据
  • 校验

我的第一张表如下所示:

----------------------------------------------------------------------------------------
|TestNo|TestDate|TestTime|LoadRate|StartLoad|StopLoad|Area|MaxLoad|MaxStrength|Checksum|

我的第二张表如下所示:

------------------
|TestNo|Time|Load|

TestNo将成为我控制数据的主键。

更新 现在我有了以下

--Import Test Results File into temp TextImport table
DROP TABLE #TextImport
CREATE TABLE #TextImport ( line VARCHAR(8000) )

INSERT  INTO #TextImport
        ( line )
        EXECUTE MASTER..xp_cmdShell 'Type "\\FilePath\Example.txt"' 


--Creates TestNo temp table to parse out data within
DROP TABLE #TestNo
CREATE TABLE #TestNo (data VARCHAR(8000), [row] VARCHAR(8000))

--Inserts TestNo into TestData temp table
INSERT INTO #TestNo(data, [row])
SELECT stuff(line, 1, 5+charindex('Test: ', line), ''),ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [ROW] FROM #TextImport

--Inserts TestNo from above into Results table
    --Assumes TestNo is always on Line 2
INSERT INTO [dbo].[Results] (TestNo)
SELECT
data 
FROM
#TestNo
WHERE [ROW] = 2

--Creates TestDate temp table
DROP TABLE #TestDate
CREATE TABLE #TestDate (data VARCHAR(8000), [row] VARCHAR(8000))

--Inserts TestDate into TestData temp table
INSERT INTO #TestDate(data, [row])
SELECT stuff(line, 1, 10+charindex('Test date: ', line), ''),ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS [ROW] FROM #TextImport 

--Inserts TestDate from above into Results table
    --Assumes TestDate is always on Line 4
----Need to pull TestNo from above rather than hard-coding it
UPDATE [dbo].[Results]
SET TestDate = (
                SELECT
                data
                FROM
                #TestDate
                WHERE [ROW] = 4
                )
WHERE TestNo = 12345

所以现在最重要的问题是

  1. 我可以从其他地方获取TestNo,所以我不必对其进行硬编码吗?
    • 我觉得我可以把它从#TestNo拉出来?
  2. 如何让它现在循环浏览文件夹而不是硬编码并开始浏览文件,处理它们,然后移动到文件夹中的下一个文件?
  3. 我如何处理图表数据?时间/负荷将它们分开并将它们拉到桌子上?

1 个答案:

答案 0 :(得分:0)

我认为你的文本文件的格式有点问题 我最近一直在导入文本文件,但它们有这样的结构:

    12345;'01/10/2010';'12:00:00';'12.345 kN';'1.234 MPa';;'123ABC4D'

这就是你的文件结构应该如何使它变得容易 如果你有这种格式,你可以使用以下代码导入文件。

    load data local infile file.txt
    into table data
    character set latin1
    fields terminated by ';';

我知道这不是你期望的答案,但我个人推荐的是一个小脚本,它将数据放入这种格式,然后以正常方式导入。其他任何事情都会有点复杂。

我希望这至少有所帮助。

问候,
塞巴斯蒂安