Как загрузить файл фиксированной ширины смешанного типа?А также файл содержит два заголовка - PullRequest
6 голосов
/ 16 апреля 2019

У меня есть задача загрузить странно отформатированный текстовый файл.Файл также содержит нежелательные данные.Он содержит два заголовка подряд, а данные для каждого заголовка указываются в альтернативных строках.Строки заголовка начинаются после ------.Мне нужно прочитать оба заголовка вместе с соответствующими данными и сбросить его в какой-либо Excel / таблицы назначения с помощью.Дайте мне знать, как решить эту проблему, используя любое преобразование в SSIS или, возможно, с помощью сценария.Не знаю, как использовать для этого задачу скрипта.

Сейчас я читаю файл в одном столбце и использую производный столбец, вручную пытаясь разбить его с помощью функции substring.Но это работает только для одного заголовка, и это слишком жестко закодированный тип.Мне нужен некоторый динамический подход для непосредственного чтения строк заголовков и строк данных.

Входной файл:

A1234-012                                         I N F O R M A T I C S  C O M P A N Y                                      08/23/17
PAGE    2 BATCH ABC                                           PAYMENT DATE & DUE DATE                                 EDIT PAGE  481
------------------------------------------------------------------------------------------------------------------------------------
 SEO  XRAT CLT     LOAN      OPENING  PAYMENT MATURIUH LOAN NEXE ORIG-AMT   OFF TO CATE  CONTC MON NO.TO  TOL NEL   S CUP CO IND PAT
 NOM  CODE NOM    NOMTER      DATE    DUO DATE  DATE   TIME PT #  MONEY         AQ LOAN  NUMBER    BLOCK   PAYMENT  U TYP GH OMG IND
       1-3 4-6  7-13/90-102  14-19    20-25     26-31 32-34 35-37 38-46   47-48 49 50-51 52-61  62  63      64-72  73 4-5 76 77 8-80
------------------------------------------------------------------------------------------------------------------------------------
 SEO  XRAT CLT     LOAN     A/C   A/C     MIN     MAX    MAX   PENDI  LATE CCH  L/F  PARTLYS  CUR   L/F      L/F     L/F
 NOM  CODE NOM    NOMTER    CODE FACTOR   MON     MON    ROAD   DAYS  MONE POT  L/A  L/F JAC  INT  VAD CD  USED PI  VAD DT
       1-3 4-6  7-13/90-102  14  15      20-23   24-29   30-34 35-37   38-42    43     44     49     60     61-63    64-69
USED-ID:
------------------------------------------------------------------------------------------------------------------------------------
454542 070 567    2136547895 08-08-18 08-06-18 11-02-18 123 256      62,222  LK  5 55 5463218975 5 3       5,555.22    33        H55
025641 055 123    5144511352 B  .55321   2.55 6531.22                                                 H      #AS
454542 070 567    2136547895 08-08-18 08-06-18 11-02-18 123 256      62,222  LK  5 55 5463218975 5 3       5,555.22    33        H55
025641 055 123    5144511352 B  .55321   2.55 6531.22                                                 H      #AS
454542 070 567    2136547895 08-08-18 08-06-18 11-02-18 123 256      62,222  LK  5 55 5463218975 5 3       5,555.22    33        H55
025641 055 123    5144511352 B  .55321   2.55 6531.22                                                 H      #AS

Ожидаемый результат должен быть:

ФАЙЛ 1:

 SEO  XRAT CLT     LOAN      OPENING  PAYMENT MATURIUH LOAN NEXE ORIG-AMT   OFF TO CATE  CONTC MON NO.TO  TOL NEL   S CUP CO IND PAT
 NOM  CODE NOM    NOMTER      DATE    DUO DATE  DATE   TIME PT #  MONEY         AQ LOAN  NUMBER    BLOCK   PAYMENT  U TYP GH OMG IND
454542 070 567    2136547895 08-08-18 08-06-18 11-02-18 123 256      62,222  LK  5 55 5463218975 5 3       5,555.22    33        H55
454542 070 567    2136547895 08-08-18 08-06-18 11-02-18 123 256      62,222  LK  5 55 5463218975 5 3       5,555.22    33        H55
454542 070 567    2136547895 08-08-18 08-06-18 11-02-18 123 256      62,222  LK  5 55 5463218975 5 3       5,555.22    33        H55

ФАЙЛ 2:

 SEO  XRAT CLT     LOAN     A/C   A/C     MIN     MAX    MAX   PENDI  LATE CCH  L/F  PARTLYS  CUR   L/F      L/F     L/F
 NOM  CODE NOM    NOMTER    CODE FACTOR   MON     MON    ROAD   DAYS  MONE POT  L/A  L/F JAC  INT  VAD CD  USED PI  VAD DT
025641 055 123    5144511352 B  .55321   2.55 6531.22                                                 H      #AS
025641 055 123    5144511352 B  .55321   2.55 6531.22                                                 H      #AS
025641 055 123    5144511352 B  .55321   2.55 6531.22                                                 H      #AS

Output:File 1 Output:File 2 sample data

1 Ответ

6 голосов
/ 16 апреля 2019

Игнорировать первые 3 строки

Чтобы игнорировать первые 3 строки, вы можете просто настроить менеджер соединений с плоскими файлами так, чтобы они игнорировались, как:

enter image description here


Разделить файл и удалить поврежденные строки

1.Настройте диспетчеры соединений

Кроме того, в диспетчере соединений с плоскими файлами перейдите на вкладку «Дополнительно» и удалите все столбцы, кроме одного, и измените его тип данных на DT_STR, а MaxLength на 4000.

enter image description here

Добавьте два диспетчера соединений, по одному для каждого файла назначения, где вы должны определить только один столбец с максимальной длиной = 4000:

enter image description here

enter image description here

2.Настроить задачу потока данных

Добавить задачу потока данных и добавить источник плоских файлов внутри.Выберите диспетчер соединений с исходным файлом.

Добавьте условное разбиение со следующими выражениями:

Файл1

FINDSTRING([Column 0],"OPENING",1) > 1 || FINDSTRING([Column 0],"DATE",1) > 1 || TOKENCOUNT([Column 0]," ") == 19

Файл2

FINDSTRING([Column 0],"A/C",1) > 1 || FINDSTRING([Column 0],"FACTOR",1) > 1 || TOKENCOUNT([Column 0]," ") == 10

enter image description here

Выражения выше созданы на основе ожидаемого результата, который вы упомянули в вопросе, я устал искать уникальные ключевые слова внутри каждогозаголовок и разделить строки данных на основе количества вхождений пространства.

Наконец, сопоставьте каждый вывод с целевым компонентом плоского файла:

enter image description here

Эксперименты

Результат выполнения показан на следующих снимках экрана:

enter image description here

enter image description here


Обновление 1 - удаление дубликатов

Чтобы удалить дубликаты, вы должны обратиться по следующей ссылке:


Обновление 2 - удаление только дубликатов заголовков + заменаПробелы с помощью Tab

Если вам нужно только удалить дубликаты заголовков, вы можете сделать это в два шага:

  1. Добавить компонент скрипта после каждого вывода условного разбиения, чтобы пометить нежелательные строки
  2. Добавление условного разбиения для фильтрации строк на основе выходных данных компонента сценария

Кроме того, поскольку значения столбцов не содержат пробелов, вы можете использовать регулярное выражение для замены пробелов с одной вкладкой насделайте файл согласованным.

Компонент сценария

В компоненте сценария добавьте выходной столбец типа DT_BOOL и назовите его outFlag, а также добавьте выходной столбец outColumn0типа DT_STR и длины, равной 4000, и выберите Column0 в качестве входного столбца.

enter image description here

enter image description here

Затем напишите следующий скрипт в Редакторе скриптов (C #) :

Сначала убедитесь, что вы добавили пространство имен RegularExpressions

using System.Text.RegularExpressions;

Код сценария

int SEOCount = 0;
int NOMCount = 0;

Regex regex = new Regex("[ ]{2,}", RegexOptions.None);


public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (Row.Column0.Trim().StartsWith("SEO"))
    {


        if (SEOCount == 0)
        {

            SEOCount++;
            Row.outFlag = true;

        }
        else
        {

            Row.outFlag = false;

        }



    }
    else if (Row.Column0.Trim().StartsWith("NOM"))
    {

        if (NOMCount == 0)
        {

            NOMCount++;
            Row.outFlag = true;

        }
        else
        {

            Row.outFlag = false;

        }

    }
    else if (Row.Column0.Trim().StartsWith("PAGE"))
    {
        Row.outFlag = false;
    }
    else
    {

        Row.outFlag = true;

    }


    Row.outColumn0 = regex.Replace(Row.Column0.TrimStart(), "\t");
}

Условное разбиение

Добавьте условное разбиение после каждого компонента сценария и используйте следующее выражение для фильтрации дублирующего заголовка:

[outFlag] == True

И подключите условное разбиение кместо назначения. Убедитесь, что сопоставили outColumn0 со столбцом назначения.

enter image description here

Ссылка на пакет

...