我对SSIS非常熟练,但绝不是专家。我的任务是导入一个相当复杂的固定宽度平面文件,其中包含标题和尾部行。现在,没有标题和预告行,我相信我可以相当容易地做到这一点。但是,我对如何使用额外的行进行此操作感到困惑。这是此示例的简化版本。第一行是标题行,最后一行拖车行之间是任意数量的数据。
0 201308190102
1 123412341234 MR JOE BLOGGS 19810529
1 123412341235 MS SUE BLOGGS 19810516
9 201308190102
列位于标题行中:操作类型0 =标题,今天的日期YYYYMMDD,序列号01,预期行数02
数据行:操作类型1,2,3取决于创建,更新,删除,卡号123412341234,标题,名字,姓氏,出生日期 预告片行:动作类型9 =页脚,今天的日期,序列号,实际行数。
我需要对文件的日期,序列号和行数进行验证检查。
现在,我不知道如何在平面文件连接管理器中设置它,因为标题/尾部详细信息与卡号相同。
所以我的想法是将行标题和尾部行按行号和文件结尾分开?我是否需要在脚本任务中将它们分开?我是否需要逐行设置平面文件连接并通过脚本任务拆分列?
答案 0 :(得分:2)
如果您可以放心地从数据中确定页眉和页脚行,我建议使用条件拆分。例如,在过去的项目中,页眉和页脚行的前两个字符分别是“HR”和“TR”。
根据该约定,我能够分离实际需要处理的行。在一个单独的路径中,我根据标题行数据进行了一些验证。最后,我合并了两个路径,因为我在标题中使用了目标表中处理日期列的日期。
答案 1 :(得分:0)
如果您在c#中有一些编码经验,我会推荐一个脚本任务。在解析一些许可文件时我遇到了同样的问题,它似乎是解析更复杂文件的唯一方法。
如果执行脚本任务,则可以完全绕过平面文件连接。以下是如何:
的简要说明首先在包中添加一个String参数。在您的脚本任务选项中,将您的参数添加为只读变量。然后使用此代码段
访问它byte[] empty = new byte[] { };
base.PreExecute();
//Outside parameter for file path
//Check for the parameter existance
IDTSVariable100 filePathVariable; //This is the var that will hold the parameter
try
{
filePathVariable = this.ReadOnlyVariables["ParameterName"];
}
catch (Exception)
{
this.Log(@"The package configuration is invalid. The variable / parameter ""ParameterName"" is missing.
It has to be available and be of type string and give the path to the file to be Imported", 0, empty);
throw;
}
string filePath = filePathVariable.Value.ToString();
现在使用类似的东西来读取文件并将其拆分成行..
try
{
using (StreamReader reader = new StreamReader(filePath))
{
//Read file and split into lines
string fileStream = reader.ReadToEnd();
fileLines = fileStream.Split('\n');
}
}
catch (Exception e)
{
this.Log(@"Error reading file into list of strings. Reason: " + e.Message, 0, empty);
throw;
}
将上述所有内容放在脚本任务的PreExecute部分以及每行所需的转换中。然后创建一个数组或行列表并输出如下:
public override void CreateNewOutputRows()
{
for (int i = 0; i < lineCount; i++)
{
ItemsBuffer.AddRow();
ItemsBuffer.ColumnName = CreatedLineList[i];
}
}
如果您对此有任何疑问,请告诉我