Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过列名称和数据在同一行中的SSI提取平面文件数据_C#_Sql_Ssis_Ssis 2012_Flat File - Fatal编程技术网

C# 通过列名称和数据在同一行中的SSI提取平面文件数据

C# 通过列名称和数据在同一行中的SSI提取平面文件数据,c#,sql,ssis,ssis-2012,flat-file,C#,Sql,Ssis,Ssis 2012,Flat File,我必须从多个文件夹中提取数据。每个文件夹可以有多个文本文件 文本文件可以有多行。如果存在多行,则每行可能具有不同的列数,如下所示: 文件名:Product-ABC.txt(文件夹中的所有文件都有前缀“Product”) 数据样本: xyzrryyywe#**Root,第2列:00-1234,第3列:否,第4列:是,第5列:55,第6列:07/17/19 aaauuuye#转让,第5栏:88,第6栏:07/18/19 xyzrryyywe#安全,第2列:00-12gfr-04,第5列:8,第6

我必须从多个文件夹中提取数据。每个文件夹可以有多个文本文件

文本文件可以有多行。如果存在多行,则每行可能具有不同的列数,如下所示:

文件名:Product-ABC.txt(文件夹中的所有文件都有前缀“Product”)

  • 数据样本:
xyzrryyywe#**Root,第2列:00-1234,第3列:否,第4列:是,第5列:55,第6列:07/17/19

aaauuuye#转让,第5栏:88,第6栏:07/18/19

xyzrryyywe#安全,第2列:00-12gfr-04,第5列:8,第6列:07/19/19

TTyyyyyyyyyywe#Root,第2列:00-134,第3列:否,第4列:是,第5列:34,第6列:04/17/19**

包括每一行的列名和数据

  • 现在我必须先拆分列名和数据
  • 然后必须为每一行处理不一致的数据列。 (每行可以是Root、Transfer或Secure,如上面的示例所示)可以有多个根行,对于Transfer和Root行也是如此。它们可能会重复多次
  • 我知道我必须使用一些脚本来处理文件中不一致的列。我很困惑如何将列名和数据从行中分离出来并动态放置

    请告诉我该如何进行

    谢谢
    我建议使用SQL server JSON格式。 将所有数据导入到一个包含3列的表中:

  • 文件夹名是什么
  • 文件名是什么
  • 和一行数据作为JSON
  • 因此,编写SSI以读取文件非常简单


    在这之后,您应该开始编写t-SQL来检查数据并应用您的条件。

    我将结合使用脚本转换(我的答案涵盖了这一点)和SQL转换(您可以在SQL中找到大量关于这一点的答案):

    首先将整行读成一列:

    xyzrryyywe#Root,第2列:00-1234,第3列:否,第4列:是,第5列:55,第6列:07/17/19

    您可以看到一致的格式(即以列分隔的值组)

    将其拆分为一个数组:

    string[] FirstSplit = Row.Col1.Split(',');
    
    注意:在本例中,您现在将拥有6个项目的数组。第一项是我猜的产品和行动或东西,但这将重复每一列。所以让我们把它储存起来

    string[] FirstCol = FirstSplit[0].Split('#');
    string Product = FirstCol[0]; //Should be xyzrryyywe
    string Action = FirstCol[1]; //Should be Root
    
    现在,让我们来处理重新生成具有ColumnName:ColumnValue模式的列

    for (int i = 1; i <= FirstSplit.Length-1; i++)
            {
                string[] cols = FirstSplit[i].Split(':');
                //Now write it out back to SSIS for loading
                Output1Buffer.AddRow();
                Output1Buffer.Product = Product;
                Output1Buffer.Action = Action;
                Output1Buffer.ColumnName = cols[0];
                Output1Buffer.ColumnValue = cols[1];
            }
    

    用于(int i=1;我基本上你只需要使用文本驱动程序导入一列。然后你可以使用脚本转换在SSI内部拆分它,或者你可以将单个列加载到一个暂存表中,并使用T-SQL拆分它。与脚本解决方案相比,我始终更喜欢T-SQL解决方案。谢谢你的回复。我已将所有数据导入到s中单个列,但它也使用列名导入。如何拆分列名和数据。您基本上希望拆分一个键值对。看看这是否有帮助:还有这个(在前面的链接中提到)我想我会在脚本转换(拆分为产品、动作、列名和列值)中都这样做并将其加载到staging中。将该staging表转换为列形式并处理数据类型。谢谢Keith。我将尝试此操作并尽快通知您。再次感谢Keith!!此方法对我有效。现在只需在第一列显示文件夹名称以过滤数据。我将很快发布它。如果您想捕获文件夹,请应该引用用于在文件夹系统中循环的变量。这是一个不同的问题,我想你已经知道怎么做了。