值包含文本限定符的 SSIS 平面文件
SSIS flat file with values containing text qualifier
我收到了一个无法通过其他方式生成的平面文件。分隔符是逗号,文本限定符是双引号。问题是有时 a 在值中有双引号。例如:
"0","12345", "Centre d"edu et de recherche", "B8E7"
由于值中的双引号,我收到此错误:
[Flat File Source [58]] Error: The column delimiter for column "XYZ" was not found.
[Flat File Source [58]] Error: An error occurred while processing file "C:\somefile.csv" on data row 296.
如何处理这个文件?
我使用 SSIS 2016 和 Visual Studio 2015
您可以使用平面文件源错误输出将坏行重定向到另一个平面文件并手动更正值,同时处理所有有效行。
网上有很多链接可以了解有关平面文件源错误输出的更多信息:
- Flat File source Error Output connection in SSIS
- How to Avoid Package Design Flaws When Sourcing Data From Flat Files
- Flat File Source Editor (Error Output Page)
更新 1 - 使用脚本组件和条件拆分的解决方法
由于平面文件错误输出不起作用,您可以使用带有条件拆分的脚本组件来过滤坏行,以下更新是实现该操作的分步指南:
- 添加平面文件连接管理器,转到高级选项卡,删除除一列以外的所有列并将其长度更改为 4000
- 添加脚本组件,转到输入和输出列选项卡,添加所需的输出列(在本例中为 4 列)并添加类型为
DT_BOOL
的标志列
- 在脚本组件中编写以下脚本来检查列数是否为 4,然后
Flag
= True
这意味着这是一个有效的行,否则将 Flag
设置为 False
这意味着这是一个错误的行:
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (!Row.Column0_IsNull && !String.IsNullOrWhiteSpace(Row.Column0))
{
string[] cells = Row.Column0.Split(new string[] { "\",\"" }, StringSplitOptions.None);
if (cells.Length == 4)
{
Row.Col1 = cells[0].TrimStart('\"');
Row.Col2 = cells[1];
Row.Col3 = cells[2];
Row.Col4 = cells[3].TrimEnd('\"');
Row.Flag = true;
}
else
{
bool cancel;
Row.Flag = false;
}
}
else
{
Row.Col1_IsNull = true;
Row.Col2_IsNull = true;
Row.Col3_IsNull = true;
Row.Col4_IsNull = true;
Row.Flag = true;
}
}
}
- 添加条件拆分以根据
Flag
列拆分行
- 将 Valid Rows 输出映射到 OLEDB Destination,将 Bad Rows 输出映射到另一个只映射
Column0
的平面文件
我收到了一个无法通过其他方式生成的平面文件。分隔符是逗号,文本限定符是双引号。问题是有时 a 在值中有双引号。例如:
"0","12345", "Centre d"edu et de recherche", "B8E7"
由于值中的双引号,我收到此错误:
[Flat File Source [58]] Error: The column delimiter for column "XYZ" was not found.
[Flat File Source [58]] Error: An error occurred while processing file "C:\somefile.csv" on data row 296.
如何处理这个文件?
我使用 SSIS 2016 和 Visual Studio 2015
您可以使用平面文件源错误输出将坏行重定向到另一个平面文件并手动更正值,同时处理所有有效行。
网上有很多链接可以了解有关平面文件源错误输出的更多信息:
- Flat File source Error Output connection in SSIS
- How to Avoid Package Design Flaws When Sourcing Data From Flat Files
- Flat File Source Editor (Error Output Page)
更新 1 - 使用脚本组件和条件拆分的解决方法
由于平面文件错误输出不起作用,您可以使用带有条件拆分的脚本组件来过滤坏行,以下更新是实现该操作的分步指南:
- 添加平面文件连接管理器,转到高级选项卡,删除除一列以外的所有列并将其长度更改为 4000
- 添加脚本组件,转到输入和输出列选项卡,添加所需的输出列(在本例中为 4 列)并添加类型为
DT_BOOL
的标志列
- 在脚本组件中编写以下脚本来检查列数是否为 4,然后
Flag
=True
这意味着这是一个有效的行,否则将Flag
设置为False
这意味着这是一个错误的行:
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
if (!Row.Column0_IsNull && !String.IsNullOrWhiteSpace(Row.Column0))
{
string[] cells = Row.Column0.Split(new string[] { "\",\"" }, StringSplitOptions.None);
if (cells.Length == 4)
{
Row.Col1 = cells[0].TrimStart('\"');
Row.Col2 = cells[1];
Row.Col3 = cells[2];
Row.Col4 = cells[3].TrimEnd('\"');
Row.Flag = true;
}
else
{
bool cancel;
Row.Flag = false;
}
}
else
{
Row.Col1_IsNull = true;
Row.Col2_IsNull = true;
Row.Col3_IsNull = true;
Row.Col4_IsNull = true;
Row.Flag = true;
}
}
}
- 添加条件拆分以根据
Flag
列拆分行
- 将 Valid Rows 输出映射到 OLEDB Destination,将 Bad Rows 输出映射到另一个只映射
Column0
的平面文件