SSIS列计数来自平面文件

时间:2011-06-13 11:32:33

标签: file ssis flat

我正试图找到一种方法来计算来自平面文件的列。实际上,我的所有列都在一个signe单元格中连接,并用“|”分隔,
经过各种尝试,似乎只有一个脚本任务才能处理这个问题。 有人可以帮助我吗?我很遗憾没有C#ou VB中的脚本经验。

非常感谢 灵光

为了更好地理解,下面是我想要实现的输出。例如,包含来自FF的所有头的单个单元。问题是,为了得到这个结果,我在上一步(派生列)中手动附加了所有列名彼此,以便将它们与'|'连接起来分隔器。 现在,如果我的FF源布局发生变化,它将不再起作用,因为这个manualy过程。所以我想我必须使用一个脚本代替它基本上返回一个变量中的列数(标题),并允许删除派生列transfo中的硬编码部分,例如

2 个答案:

答案 0 :(得分:1)

这是一个非常古老的线索;但是,我只是偶然发现了类似的问题。一个平面文件,里面有许多不同的记录“格式”。许多不同的格式,没有任何特定的顺序,这意味着你可能在一行中有57个字段,然后在接下来的1000个中有59个,然后在接下来的10000个中有56个,回到57个......好吧,你认为你有了这个想法。

由于缺乏更好的想法,我决定根据每行中的逗号数量打破该文件,然后使用每种类型的SSIS包导入不同的记录类型(现在聚集在一起)。

所以这个问题的答案就在那里,有更多代码来生成文件。

希望这可以帮助有同样问题的人。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace OddFlatFile_Transformation
{
    class RedistributeLines
    {
    /*
     * This routine opens a text file and reads it line by line
     * for each line the number of "," (commas) is counted
     * and then the line is written into a another text file
     * based on that number of commas found
     * For example if there are 15 commas in a given line
     * the line is written to the WhateverFileName_15.Ext
     * WhaeverFileName and Ext are the same file name and 
     * extension from the original file that is being read
     * The application tests WhateverFileName_NN.Ext for existance
     * and creates the file in case it does not exist yet
     * To Better control splited records a sequential identifier, 
     * based on the number of lines read, is added to the beginning
     * of each line written independently of the file and record number
     */
        static void Main(string[] args)
        {
            // get full qualified file name from console
            String strFileToRead;
            strFileToRead = Console.ReadLine();

            // create reader & open file
            StreamReader srTextFileReader = new StreamReader(strFileToRead);

            string strLineRead = "";
            string strFileToWrite = "";
            string strLineIdentifier = "";
            string strLineToWrite = "";
            int intCountLines = 0;
            int intCountCommas = 0;
            int intDotPosition = 0;
            const string strZeroPadding = "00000000";

            // Processing begins
            Console.WriteLine("Processing begins: " + DateTime.Now);

            /* Main Loop */
            while (strLineRead != null)
            {
                // read a line of text count commas and create Linde Identifier
                strLineRead = srTextFileReader.ReadLine();
                if (strLineRead != null)
                {
                    intCountLines += 1;
                    strLineIdentifier = strZeroPadding.Substring(0, strZeroPadding.Length - intCountLines.ToString().Length) + intCountLines;
                    intCountCommas = 0;
                    foreach (char chrEachPosition in strLineRead)
                    {
                        if (chrEachPosition == ',') intCountCommas++;
                    }

                    // Based on the number of commas determined above
                    // the name of the file to be writen to is established
                    intDotPosition = strFileToRead.IndexOf(".");
                    strFileToWrite = strFileToRead.Substring (0,intDotPosition) + "_";
                    if ( intCountCommas < 10)
                    {
                        strFileToWrite += "0" + intCountCommas;
                    }
                    else
                    {
                        strFileToWrite += intCountCommas;
                    }
                    strFileToWrite += strFileToRead.Substring(intDotPosition, (strFileToRead.Length - intDotPosition));

                    // Using the file name established above the line captured
                    // during the text read phase is written to that file

                    StreamWriter swTextFileWriter = new StreamWriter(strFileToWrite, true);
                    strLineToWrite = "[" + strLineIdentifier + "] " + strLineRead; 
                    swTextFileWriter.WriteLine (strLineToWrite);
                    swTextFileWriter.Close();
                     Console.WriteLine(strLineIdentifier);
               }
            }

            // close the stream
            srTextFileReader.Close();
            Console.WriteLine(DateTime.Now);
            Console.ReadLine();
        }
    }


}

答案 1 :(得分:0)

请在以下Stack Overflow个问题中查阅我的答案。这些答案可能会让您了解如何加载包含不同列数的平面文件。

  1. 以下问题中的示例读取包含由特殊字符 Ç (c-cedilla) 分隔的数据的文件。在您的情况下,分隔符为Vertical Bar (|) UTF-8 flat file import to SQL Server 2008 not recognizing {LF} row delimiter

  2. 以下问题中的示例读取包含具有不同列数的不同部分的EDI文件。包读取文件将相应的父子关系加载到SQL表中。 how to load a flat file with header and detail parent child relationship into SQL server

  3. 根据这些答案中使用的逻辑,您还可以通过按列分隔符(Vertical Bar |)拆分文件中的行来计算列数。

    希望有所帮助。