Подсчет столбцов служб SSIS из плоского файла - PullRequest
0 голосов
/ 13 июня 2011

Я пытаюсь найти способ подсчитать мои столбцы, поступающие из плоского файла.На самом деле, все мои столбцы объединяются в ячейке подписи, разделенной знаком '|',
после различных попыток кажется, что справиться может только задача скрипта.Кто-нибудь может мне помочь с этим?У меня, к сожалению, нет опыта работы со скриптом на C # ou VB.

Большое спасибо, Эммануэль

Чтобы лучше понять, ниже приведен вывод того, чего я хочу достичь.например, одна ячейка, содержащая все заголовки, поступающие из FF.Дело в том, что для достижения этого результата я вручную добавил в предыдущем шаге (производный столбец) все имена столбцов друг друга, чтобы объединить их с помощью '|'разделитель.Теперь, если мой исходный макет FF изменится, он больше не будет работать из-за этого ручного процесса.Поэтому я думаю, что вместо этого мне придется использовать скрипт, который в основном возвращает мое количество столбцов (заголовка) в переменной и позволит удалить жестко закодированную часть в производном столбце transfo, например

Ответы [ 2 ]

1 голос
/ 30 марта 2014

Это очень старая тема;однако я просто наткнулся на похожую проблему.Плоский файл с несколькими различными «форматами» записи внутри.Множество разных форматов, но не в определенном порядке. Это значит, что у вас может быть 57 полей в одной строке, затем 59 в следующей 1000, затем 56 в следующие 10000, обратно к 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();
        }
    }


}
0 голосов
/ 13 июня 2011

Пожалуйста, присылайте мои ответы на следующие Stack Overflow вопросы.Эти ответы могут дать вам представление о том, как загрузить плоский файл, содержащий различное количество столбцов.

  1. Пример в следующем вопросе читает файл, содержащий данные, разделенные специальным символом Ç (c-cedilla).В вашем случае это разделитель Vertical Bar (|) UTF-8, импорт плоских файлов в SQL Server 2008, не распознающий {LF} разделитель строк

  2. Пример в следующем вопросе читает файл EDI, который содержит различные разделы с различным количеством столбцов.Пакет читает файл и загружает его в соответствии с родительскими и дочерними отношениями в таблицу SQL. как загрузить плоский файл с заголовком и подробными родительскими и дочерними отношениями в SQL-сервер

Исходя из логики, использованной в этих ответах, вытакже можно посчитать количество столбцов, разделив строки в файле по разделителю столбцов (Vertical Bar |).

Надеюсь, это поможет.

...