忽略前 3 行
要忽略前 3 行,您可以简单地配置平面文件连接管理器来忽略它们,类似于:
分割文件并删除坏行
1. 配置连接管理器
此外,在平面文件连接管理器中,转到高级选项卡并删除除一列之外的所有列,并将其数据类型更改为DT_STR
和最大长度4000
.
添加两个连接管理器,每个目标文件一个,您必须仅定义最大长度 = 4000 的一列:
2.配置数据流任务
添加一个数据流任务,并在里面添加一个平面文件源。选择源文件连接管理器。
使用以下表达式添加条件分割:
File1
FINDSTRING([Column 0],"OPENING",1) > 1 || FINDSTRING([Column 0],"DATE",1) > 1 || TOKENCOUNT([Column 0]," ") == 19
File2
FINDSTRING([Column 0],"A/C",1) > 1 || FINDSTRING([Column 0],"FACTOR",1) > 1 || TOKENCOUNT([Column 0]," ") == 10
上面的表达式是根据您在问题中提到的预期输出创建的,我厌倦了在每个标题中搜索唯一关键字并根据空格出现的次数分割数据行。
最后将每个输出映射到目标平面文件组件:
实验
执行结果如下图所示:
更新 1 - 删除重复项
要删除重复项,您必须可以参考以下链接:
更新 2 - 仅删除重复的标题 + 用 Tab 替换空格
如果您只需要删除重复的标头,那么您可以分两步执行此操作:
- 在每个条件分割输出后添加一个脚本组件以标记不需要的行
- 添加条件拆分以根据脚本组件输出过滤行
另外,由于列值不包含空格,可以使用正则表达式将空格替换为单个Tab,以使文件一致。
脚本组件
在脚本组件中添加一个类型为 DT_BOOL 的输出列并将其命名outFlag
还添加一个输出列outColumn0
类型的DT_STR
和长度等于4000
并选择Column0
作为输入列。
然后在脚本编辑器中编写以下脚本(C#):
首先确保添加正则表达式命名空间
using System.Text.RegularExpressions;
脚本代码
int SEOCount = 0;
int NOMCount = 0;
Regex regex = new Regex("[ ]{2,}", RegexOptions.None);
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (Row.Column0.Trim().StartsWith("SEO"))
{
if (SEOCount == 0)
{
SEOCount++;
Row.outFlag = true;
}
else
{
Row.outFlag = false;
}
}
else if (Row.Column0.Trim().StartsWith("NOM"))
{
if (NOMCount == 0)
{
NOMCount++;
Row.outFlag = true;
}
else
{
Row.outFlag = false;
}
}
else if (Row.Column0.Trim().StartsWith("PAGE"))
{
Row.outFlag = false;
}
else
{
Row.outFlag = true;
}
Row.outColumn0 = regex.Replace(Row.Column0.TrimStart(), "\t");
}
有条件分割
在每个脚本组件后面添加条件分割,并使用以下表达式来过滤重复的标头:
[outFlag] == True
并将条件拆分连接到目的地。确保映射outColumn0
到目标列。
套餐链接
- https://www.dropbox.com/s/d936u4xo3mkzns8/Package.dtsx?dl=0