我有一个带有页眉和页脚的固定长度的平面文件,但是这些行没有任何标识符,例如 H 代表页眉、T 代表预告片或 D 代表数据或类似的东西。
我所有的数据都从位置 1 开始,但页眉和页脚以行格式的不同位置开始。我尝试使用条件拆分,但无法得到我想要的结果。
请帮助我找到一些逻辑来从数据文件中获取页眉和页脚。我想将数据存储在 SQL Server 表中,并将页眉/页脚数据存储在平面文件中以供将来参考。
我有一个带有页眉和页脚的固定长度的平面文件,但是这些行没有任何标识符,例如 H 代表页眉、T 代表预告片或 D 代表数据或类似的东西。
我所有的数据都从位置 1 开始,但页眉和页脚以行格式的不同位置开始。我尝试使用条件拆分,但无法得到我想要的结果。
请帮助我找到一些逻辑来从数据文件中获取页眉和页脚。我想将数据存储在 SQL Server 表中,并将页眉/页脚数据存储在平面文件中以供将来参考。
由于您没有在问题中包含确切的文件格式,让我们假设看起来像这样:
This is the header line with some spaces at the beginning.
This, is, real, line 1
This, is, real, line 2
End of file. It has some spaces too at the beginning.
如果这是您的情况的正确表示,您可以使用平面文件源,在一列中完整读取每条记录,例如 EntireRow,然后使用条件拆分来使用以下条件识别页眉/页脚:
LEN(EntireRow) > LEN(TRIM(EntireRow))
这里的问题是如何拆分有意义的行(上面示例中的实际第 1 行和第 2 行)。您可以将其转储到另一个文件中。现在,这个文件将是干净的,并删除了页眉和页脚。这是一个简单但不是最有效的解决方案。
解决方案2:
更好的解决方案是使用脚本组件。了解如何动态添加行。一个这样的例子:http ://www.sqlis.com/post/The-Script-Component-as-a-Transformation.aspx
现在,为了让您开始,一个示例代码将使用您的条件消除页眉/页脚,即它们不从位置 1 开始......没有错误处理。上面的链接将告诉您如何添加输出以及该输出中的列。确保您的列的数据类型与源文件的数据类型相匹配。
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
/*
Add your code here
*/
if ((Row.EntireRow.Length == Row.EntireRow.Trim().Length))
{
string[] sArrFields = Row.EntireRow.Split(',');
MeaningfulBuffer.AddRow();
MeaningfulBuffer.Col1 = sArrFields[0];
MeaningfulBuffer.Col2 = sArrFields[1];
MeaningfulBuffer.Col3 = sArrFields[2];
MeaningfulBuffer.Col4 = sArrFields[3];
}
}
希望这么多指导足以解决您的问题,并且我提供的两种解决方案之一有效。请回复。