在ForeachLoop容器上处理平面文件源中的不一致分隔符

时间:2014-11-07 08:08:11

标签: ssis delimiter flat-file foreach-loop-container

我正在尝试处理在SSIS中的Foreach循环容器中运行的数据流任务中包含的'n平面文件源中的不一致分隔符。

我在一个文件夹中有多个文件,这些文件名不同但有一个一致的标识符,例如 File23998723.txt File39872397.txt File29387234.txt等等

这些文件作为标准应该是制表符分隔的,但是每隔一段时间用户就会错过清理一个文件,并且它将用a或a分隔;等,导致包导入失败。

我可以通过简单的方法来动态更改分隔符或预先测试分隔符吗?

Column Delimiter

1 个答案:

答案 0 :(得分:2)

我设法用脚本任务处理它,谢谢!

基本上将一个脚本任务添加到在我的DataFlow任务之前执行的Foreach循环容器中。

我将文件名作为变量发送: Script Task Variable

我在脚本中添加了以下命名空间:

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;
            }
        }
    }