如何识别由于.txt文件中隐藏的#而导致列中数据缺失的行

时间:2018-08-10 10:30:27

标签: sql sql-server postgresql

我有一个从源系统导出的.txt文件。由于在导出.txt文件时源系统中的一个字段中的#在导出时,#字段之后的某些数据在.txt文件中没有任何数据。

例如下面的例子。

LINE|PANO| INOW|DEL|EASLN|EBSAP|LIM1IT|NOMIT|VALUE|KTE1|
1|7870|1000000||40500369|10|25624.0||0.00|SERVI TORNG|33277|
2|294|1000000||500324|10|590.84 ||0.00|REFUDIAL GATNGWAM|30448|
3|9410|1000000||200500325|10|5905.61||0.00|SUPLIVER EXTRACNS|37478|
4|573|1000000||600004075|10||||||||
5|739|1000000||700500290|10|40917.37|||||||
6|741|1000000||50500289|10|2782.53 ||0.00|SECUERVIC LUWE|29161|
7|948|1000000||||||||||||
8|996|1000000||960050035|10|7497.3||0.00|SCOUOUT URBISH IDM647 |38271|
9|1320|1000000||800500319|10|1395.93||0.00|TUATO AIRS|36427|
10|12054|1000000||9000287|10|458.42||0.00|SECURICE GOLA|||||

在上面的示例中,由于源系统字段中的#,某些字段之后的第4、5、7和10行数据丢失。但是源系统中有这些订单项的数据。

如果我有大量的.txt文件用于1000万个订单项,那么如何将这些订单项识别为缺少的信息/记录问题。

请与其他人共享SQL查询/以其他方式来识别这些缺少数据的订单项。

另一个例子

LINE|PANO| INOW|DEL|EASLN|EBSAP|LIM1IT|NOMIT|VALUE|KTE1|
1|7870|1000000||40500369|10|25624.0||0.00|SERVI TORNG|33277|
2|294|1000000||500324|10|590.84 ||0.00|REFUDIAL GATNGWAM|30448|
3|9410|1000000||200500325|10|5905.61||0.00|SUPLIVER EXTRACNS|37478|
4|573|1000000||600004075|10
5|739|1000000||700500290|10|40917.37
6|741|1000000||50500289|10|2782.53 ||0.00|SECUERVIC LUWE|29161|
7|948|1000000
8|996|1000000||960050035|10|7497.3||0.00|SCOUOUT URBISH IDM647 |38271|
9|1320|1000000||800500319|10|1395.93||0.00|TUATO AIRS|36427|
10|12054|1000000||9000287|10|458.42||0.00|SECURICE GOLA

如果#存在,则数据将被截断。

1 个答案:

答案 0 :(得分:0)

您需要以下什么吗?

我创建了一个临时表#HiddenHash,并用您的一些示例数据填充了该表,您显然会从BULK INSERT或使用的任何机制中获取数据。

CREATE TABLE 
#HiddenHash
(
LINE VARCHAR (2)
,PANO VARCHAR (25) 
,INOW VARCHAR (25)
,DEL VARCHAR (25)
,EASLN VARCHAR (25)
,EBSAP VARCHAR (25)
,LIM1IT VARCHAR (25)
,NOMIT VARCHAR (25)
,VALUE VARCHAR (25)   
,KTE1 VARCHAR (25)
)

INSERT INTO #HiddenHash
VALUES
('1','7870','1000000','','40500369','10','25624.0','0.00','SERVI TORNG','33277')
,('2','294','1000000','',' 500324','10','590.84 ','0.00','REFUDIAL GATNGWAM','30448')
,('3','9410','1000000','','200500325','10','5905.61','0.00','SUPLIVER EXTRACNS','37478')
,('4','573','1000000','','600004075','10','','','','')
,('5','739','1000000','','700500290','10','40917.37','','','')
,('6','741','1000000','','50500289','10','2782.53 ','0.00','SECUERVIC LUWE','29161')
,('7','948','1000000','','','','','','','')
,('8','996','1000000','','960050035','10','7497.3','0.00','SCOUOUT URBISH IDM647 ','38271')
,('9','1320','1000000','','800500319','10','1395.93','0.00','TUATO AIRS','36427')
,('10','12054','1000000','','9000287','10','458.42','0.00','SECURICE GOLA','')

然后我计算表中有多少列。

    DECLARE @CountColumns INT


    SET @CountColumns = (SELECT COUNT (*) 
                        FROM TEMPDB.SYS.COLUMNS
                        WHERE NAME <> 'DEL' AND
                         object_id = object_id('tempdb.dbo.#HiddenHash')
                         )

然后计算那些列为空白的行,并显示那些与变量中包含的列数不匹配的行。

    SELECT LINE,PANO,INOW,EASLN,EBSAP,LIM1IT,NOMIT,VALUE,KTE1 
       FROM (
            SELECT 
            LINE,PANO,INOW,EASLN,EBSAP,LIM1IT,NOMIT,VALUE,KTE1, 
            (
            SELECT COUNT(*) 
            FROM (VALUES (LINE),(PANO),(INOW),(EASLN),(EBSAP),(LIM1IT),(NOMIT), 
           (VALUE),(KTE1)) AS Cnt(col) 
        WHERE Cnt.Col <> ''
        ) AS NotBlank
    FROM #HiddenHash)cc
    WHERE cc.NotBlank <> @CountColumns

给出以下结果

LINE    PANO    INOW    EASLN       EBSAP   LIM1IT   NOMIT  VALUE       KTE1
4       573     1000000 600004075   10              
5       739     1000000 700500290   10      40917.37            
7       948     1000000                     
10      12054   1000000 9000287     10       458.42  0.00   SECURICE GOLA