【问题标题】:Split flat file destination for every 100 rows into a new file将每 100 行的平面文件目标拆分为一个新文件
【发布时间】:2015-08-25 17:52:56
【问题描述】:

我目前有一个数据流任务,它有一个 OLEDB 源和一个平面文件目标。

我现在必须修改它以创建一个像现在一样的平面文件,但每 100 行创建一个新文件。

所以如果总共有 250 行,我将不得不创建 3 个文件。

file1.txt  // contains rows 1-100
file2.txt  // 101-200
file3.txt  // 201-250

行数是动态的,我事先不知道要创建多少行/文件。

我有什么选择?

我在这个项目中使用 VS 2008。

【问题讨论】:

  • 像这样的时代,unix 很方便。无论哪种方式,SSIS 方式都是 1) 数据流中的脚本目标,它执行所有写入文件活动。非常适合灵活性,但由于您没有使用“本机”目的地,因此可维护性不佳。 2) 使用一个普通的平面文件目标,file.txt,然后在 DFT 之后有一个执行脚本任务,然后在那里进行文件拆分。我自己可能会选择#2,更容易调试
  • @billinkc 您指的是“脚本组件”吗?这是 vs 2008 我没有看到脚本任务。
  • “脚本组件”是您添加到数据流中的内容。 “脚本任务”是您添加到控制流中的内容。
  • @TabAlleman 是的,但他的意思是在平面文件目标或脚本任务之后在我的数据流中使用脚本组件吗?不确定我是否理解如何使用脚本任务在 SSIS 中进行设置。
  • 一个脚本组件,它位于数据流任务内部,充当目标。当您将它添加到数据流时,它会询问您是否希望它充当源、转换或目标,我的手指将其缩短为脚本目标。对此深表歉意。

标签: sql-server ssis flat-file


【解决方案1】:

我在脚本任务中做了类似的事情:

    public void Main()
    {
        string var_FileSource = Dts.Variables["var_FileSource"].Value.ToString();
        string baseName = var_FileSource + "file_";

        StreamWriter writer = null;

        try
        {
            using (StreamReader inputfile = new System.IO.StreamReader(var_FileSource + "P:\txt"))  
            {

                int count = 0;
                int filecount = 0;
                string line;

                while ((line = inputfile.ReadLine()) != null)
                {

                    if (writer == null || count > 99)
                    {
                        count = 0;
                        if (writer != null)
                        {
                            writer.Close();
                            writer = null;
                        }
                        ++filecount;
                        writer = new System.IO.StreamWriter(baseName + filecount.ToString() + ".txt", true);
                    }
                    writer.WriteLine(line);

                    ++count;
                }
            }
        }
        catch (Exception ex)
        {
            Dts.TaskResult = (int)ScriptResults.Failure;
        }

        finally
        {
            if (writer != null)
                writer.Close();
        }

        Dts.TaskResult = (int)ScriptResults.Success;
    }

此脚本应将目标文件分成 100 行子文件,类似于您想要的。我相信 C# 专家可以提出一些改进建议。

编辑:同时更改所有变量引用的路径,以及拆分文件的计数值。这将使未来的更改变得更加容易。

【讨论】:

  • 这在 SSIS 中看起来如何。我目前有一个执行 OLEDB -> 平面文件目标的数据流任务。您的脚本任务在这张图片中适合什么位置?
  • 数据流任务执行后,您将调用此脚本任务,该任务将为您拆分创建的文件。您可能需要一个文件系统删除任务,该任务在完成时也会删除原始文件。
猜你喜欢
  • 2016-09-20
  • 2023-03-22
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 2021-03-04
  • 2014-05-23
  • 2015-02-27
  • 2015-01-07
相关资源
最近更新 更多