我正在尝试处理在 SSIS 的 Foreach 循环容器中运行的数据流任务中包含的 'n 平面文件源中不一致的分隔符。
我在一个文件夹中有几个文件,名称各不相同,但标识符一致,例如 File23998723.txt File39872397.txt File29387234.txt 等等等等。
这些文件,作为标准应该用制表符分隔,但用户经常错过清理文件,它会用 , 或 ; 分隔。等,导致包导入失败。
我是否有一种简单的方法可以动态更改分隔符或预先测试分隔符?
我正在尝试处理在 SSIS 的 Foreach 循环容器中运行的数据流任务中包含的 'n 平面文件源中不一致的分隔符。
我在一个文件夹中有几个文件,名称各不相同,但标识符一致,例如 File23998723.txt File39872397.txt File29387234.txt 等等等等。
这些文件,作为标准应该用制表符分隔,但用户经常错过清理文件,它会用 , 或 ; 分隔。等,导致包导入失败。
我是否有一种简单的方法可以动态更改分隔符或预先测试分隔符?
我设法用脚本任务处理它,谢谢!
基本上在我的 DataFlow 任务之前执行的 Foreach 循环容器中添加了一个脚本任务。
我将文件名作为变量发送:
我在脚本中添加了以下命名空间:
using System.IO;
using RuntimeWrapper = Microsoft.SqlServer.Dts.Runtime.Wrapper;
我的脚本如下所示:
public void Main()
{
if (!string.IsNullOrEmpty(Dts.Variables["sFileName"].Value.ToString()))
{
StreamReader file = new StreamReader(Dts.Variables["sFileName"].Value.ToString());
if (file != null)
{
string HeadRowDelimiter = "";
string ColDelimiter = "";
string data = "";
while (file.Peek() >= -1)
{
char[] c = new char[500];
file.Read(c, 0, c.Length);
data = string.Join("", c);
if (!string.IsNullOrEmpty(data))
{
//set row delimiters
if (data.Contains("\r\n"))
{
HeadRowDelimiter = "\r\n";
}
else if (data.Contains("\r"))
{
HeadRowDelimiter = "\r";
}
else if (data.Contains("\n"))
{
HeadRowDelimiter = "\n";
}
else if (data.Contains("\0"))
{
HeadRowDelimiter = "\0";
}
//set column delimiters
if (data.Contains("\t"))
{
ColDelimiter = "\t";
}
else if (data.Contains(";"))
{
ColDelimiter = ";";
}
else if (data.Contains(","))
{
ColDelimiter = ",";
}
else if (data.Contains(":"))
{
ColDelimiter = ":";
}
else if (data.Contains("|"))
{
ColDelimiter = "|";
}
else if (data.Contains("\0"))
{
ColDelimiter = "\0";
}
}
break;
}
file.Close();
RuntimeWrapper.IDTSConnectionManagerFlatFile100 flatFileConnection = Dts.Connections["FlatFileConnection"].InnerObject as RuntimeWrapper.IDTSConnectionManagerFlatFile100;
if (flatFileConnection != null)
{
flatFileConnection.HeaderRowDelimiter = HeadRowDelimiter;
flatFileConnection.RowDelimiter = HeadRowDelimiter;
flatFileConnection.HeaderRowsToSkip = 0;
flatFileConnection.Columns[0].ColumnDelimiter = ColDelimiter;
}
Dts.TaskResult = (int)ScriptResults.Success;
}
}
}