0

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

我在一个文件夹中有几个文件,名称各不相同,但标识符一致,例如 File23998723.txt File39872397.txt File29387234.txt 等等等等。

这些文件,作为标准应该用制表符分隔,但用户经常错过清理文件,它会用 , 或 ; 分隔。等,导致包导入失败。

我是否有一种简单的方法可以动态更改分隔符或预先测试分隔符?

列分隔符

4

1 回答 1

2

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

基本上在我的 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;
            }
        }
    }
于 2014-11-11T05:22:22.080 回答