【问题标题】:Flat File to SQL server平面文件到 SQL 服务器
【发布时间】:2023-01-08 08:58:19
【问题描述】:

我想从 TXT/FLAT 文件中读取数据,并使用第一列内容作为列名和分号后的数据作为记录来排列数据。

样本数据

{1:F01SBZAZAJJXXXX9999999999}{2:I940SBICMWMXXXXXN}{4:
:20:D424A100110011E4
:25:020083203
:28C:49/1
:60F:C140106ZAR1029873,62
:61:1401060106DR5000,NTRF99999999//NONREF20140106-13175-016050001844421
:86:/PREF/ZA000520CATS THIRD PARTY PAYMENT
:62F:C140106ZAR0,00
-}

{1:F01SBZAZAJJXXXX9999999999}{2:I940SBICMWMXXXXXN}{4:
:20:D3DE7040110011E4
:25:020083204
:28C:51/1
:60F:C140106NAD1030073,
:61:1401060106DR5000,NTRF20140106-13175-0//NONREF20140106-13175-016050001844421
:86:/PREF/NA000520TRANSFER
:62F:C140106NAD0,00
-}

下面的查询只适用于一个块...我需要一个查询来读取整个数据集并按照上图所示进行排列。

SELECT [20], [25], [28C], [60F], [61], [86], [62F] 
FROM
(SELECT column2, column3 FROM [dbo].[Sample MT940]) AS Source_Table
PIVOT
(MAX(column3)
FOR 
column2 in ([20], [25], [28C], [60F], [61], [86], [62F])
) AS PIVOT_TABLE

预期成绩

【问题讨论】:

  • 我从 txt 文件导入数据,结果如 SAMPLE DATA 部分所示
  • GO CREATE TABLE [dbo].[Sample_MT940]( [column1] [nvarchar](100) NOT NULL ) ON [PRIMARY] GO GO INSERT INTO [dbo].[Sample_MT940] ([column1]) VALUES (<column1, nvarchar( 100),>) 开始
  • SQL 可能不是这项工作的最佳工具。
  • @DavidBrowne-Microsoft 您想要什么工具?
  • 要么是某种理解该文件格式的工具,要么是具有更好文本解析能力的过程编程语言,如 python、C# 等。

标签: sql-server external-tables charindex string-function


【解决方案1】:

请尝试以下解决方案。

假设您始终拥有目标表中每一行的完整值集:([20]、[25]、[28C]、[60F]、[61]、[86]、[62F])

我们通过 NTILE() 函数将所有行制动到桶中,每个桶中有 9 个连续的行。

数据库

-- DDL and sample data population, start
DECLARE @tbl TABLE (Token VARCHAR(1024));
INSERT @tbl (Token) VALUES
('{1:F01SBZAZAJJXXXX9999999999}{2:I940SBICMWMXXXXXN}{4:'),
(':20:D424A100110011E4'),
(':25:020083203'),
(':28C:49/1'),
(':60F:C140106ZAR1029873,62'),
(':61:1401060106DR5000,NTRF99999999//NONREF20140106-13175-016050001844421'),
(':86:/PREF/ZA000520CATS THIRD PARTY PAYMENT'),
(':62F:C140106ZAR0,00'),
('-}'),
('{1:F01SBZAZAJJXXXX9999999999}{2:I940SBICMWMXXXXXN}{4:'),
(':20:D3DE7040110011E4'),
(':25:020083204'),
(':28C:51/1'),
(':60F:C140106NAD1030073,'),
(':61:1401060106DR5000,NTRF20140106-13175-0//NONREF20140106-13175-016050001844421'),
(':86:/PREF/NA000520TRANSFER'),
(':62F:C140106NAD0,00'),
('-}');
-- DDL and sample data population, end

DECLARE @group INT = (SELECT COUNT(*) FROM @tbl) / 9

;WITH rs AS
(
    SELECT * 
        , seq = (ROW_NUMBER() OVER (ORDER BY (SELECT NULL))) % 9
        , grp = NTILE(@group) OVER (ORDER BY (SELECT NULL))
    FROM @tbl
)
SELECT DISTINCT [20] = MAX(IIF(seq = 2, token, '')) OVER (PARTITION BY grp)
    , [25] = MAX(IIF(seq = 3, token, '')) OVER (PARTITION BY grp)
    , [28C] = MAX(IIF(seq = 4, token, '')) OVER (PARTITION BY grp)
    , [60F] = MAX(IIF(seq = 5, token, '')) OVER (PARTITION BY grp)
    , [61] = MAX(IIF(seq = 6, token, '')) OVER (PARTITION BY grp)
    , [86] = MAX(IIF(seq = 7, token, '')) OVER (PARTITION BY grp)
    , [62F] = MAX(IIF(seq = 8, token, '')) OVER (PARTITION BY grp)
FROM rs;

输出

20 25 28C 60F 61 86 62F
:20:D3DE7040110011E4 :25:020083204 :28C:51/1 :60F:C140106NAD1030073, :61:1401060106DR5000,NTRF20140106-13175-0//NONREF20140106-13175-016050001844421 :86:/PREF/NA000520TRANSFER :62F:C140106NAD0,00
:20:D424A100110011E4 :25:020083203 :28C:49/1 :60F:C140106ZAR1029873,62 :61:1401060106DR5000,NTRF99999999//NONREF20140106-13175-016050001844421 :86:/PREF/ZA000520CATS THIRD PARTY PAYMENT :62F:C140106ZAR0,00

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2018-02-26
    • 2014-01-12
    • 1970-01-01
    相关资源
    最近更新 更多