C# 通过列名称和数据在同一行中的SSI提取平面文件数据
我必须从多个文件夹中提取数据。每个文件夹可以有多个文本文件 文本文件可以有多行。如果存在多行,则每行可能具有不同的列数,如下所示: 文件名:Product-ABC.txt(文件夹中的所有文件都有前缀“Product”)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
- 数据样本:
我建议使用SQL server JSON格式。 将所有数据导入到一个包含3列的表中:
在这之后,您应该开始编写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!!此方法对我有效。现在只需在第一列显示文件夹名称以过滤数据。我将很快发布它。如果您想捕获文件夹,请应该引用用于在文件夹系统中循环的变量。这是一个不同的问题,我想你已经知道怎么做了。