2016-09-21 109 views
0

关于如何将一长串文本分割成多个固定宽度为4个字符且没有分隔符的记录的任何想法?将文本分割为4个字符(不带分隔符)

例如:

来源:

1 11223344 
2 ABCD 
3 XYZ12345 

预期结果:

1 1122 
1 3344 
2 ABCD 
3 XYZ1 
3 2345 

文本的长字符串是当前在表中的一列。我最终的结果是把它的前4个字符放到一个记录中,将下一个4个字符放到另一个记录中,依此类推。我还需要有一个标识符来告诉第一个X数量的记录属于源文件的第一个记录等(在上例中,它是第一列 - 1,2,3)

+0

是'长字符串文本分成多个records'在一个表中的一个字段?或多个字段,表? –

+0

长串文字当前在表格的一列中。我的最终结果是将它的前4个字符放到一个记录中,将下一个4个字符放到另一个记录中,依此类推。我还需要有一个标识符来说明第一个X数量的记录属于源文件的第一个记录等(在上面的例子中,它是第一列--1,2,3)。 – user1688194

+0

你的源代码中没有分隔符?我认为如果你的源代码是'1 11223344'分隔符是'Tab' –

回答

0

请按照下面的步骤。

  1. 创建一个按字符长度拆分数据的函数。

    CREATE FUNCTION SplitStringByLength 
    ( 
    @inputString varchar(max), 
    @length int 
    ) 
    RETURNS @SplitStrings TABLE(SplitString VARCHAR(50)) 
    AS 
    BEGIN 
        DECLARE @s VARCHAR(50) 
        WHILE len(@inputString) > 0 
        BEGIN 
         SET @s = left(@inputString, @length) 
         SET @inputString = right(@inputString, len(@inputString) - @length) 
         INSERT @SplitStrings VALUES (@s) 
        END 
    RETURN 
    END 
    
  2. 通过传递您的列和字符的长度作为输入如下所示调用函数。

    SELECT ID ,SplitString 
    FROM YourTable 
        CROSS APPLY 
        dbo.SplitStringByLength (YourColumn,4)-- mention the character length to split 
    

输出: enter image description here

1

使用此查询为所需的输出:

Select substring('11223344',0,5) 
Select substring('11223344',5,9) 
Select substring('ABCD',0,5) 
------Select substring('ABCD',5,9) 
Select substring('XYZ12345',0,5) 
Select substring('XYZ12345',5,9) 
0

递归CTE可以帮助你:

;WITH cte AS (
SELECT ID, 
     CAST(SUBSTRING(string,1,4) as nvarchar(4))as S, 
     LEN(String) as L, 
     1 as [Level] 
FROM YourTable 
UNION ALL 
SELECT y.ID, 
     CAST(SUBSTRING(string,(4*[Level])+1,(4*[Level])+4) as nvarchar(4)), 
     L-4, 
     [Level]+1 
FROM YourTable y 
INNER JOIN cte c 
    ON y.ID = c.ID 
WHERE L > 4 
) 

SELECT ID, 
     S 
FROM cte 
ORDER BY ID 

输出:

ID S 
1 1122 
1 3344 
2 ABCD 
3 XYZ1 
3 2345