SSIS Load CSV с разным количеством столбцов на каждую загрузку - PullRequest
0 голосов
/ 15 апреля 2020

Мы работаем над заданием SSIS для загрузки файла CSV в таблицу SQL. Эта работа должна быть запланирована для ежедневной загрузки. Проблема в том, что этот файл CSV поставляется с разными столбцами каждый день. Структура файла выглядит следующим образом:

<table border="1">
<tr><td>Date</td><td>New York</td><td>Washington</td><td>London</td></tr>
<tr><td>15-04-2020</td><td>2</td><td>3</td><td>20</td></tr>
<tr><td>16-04-2020</td><td>30</td><td>50</td><td>22</td></tr>
</table>

Столбец даты остается таким же, как и число столбцов для изменений города на основе данных за этот день. Это может быть 1 городская колонна или еще много городских колонн. Каждый столбец города означает количество лайков из этого города в тот день.

Я собираюсь преобразовать структуру в структуру из 3 столбцов, включающую в себя дату, название города и количество лайков.

Но как бы компонент исходного плоского файла справился бы с этим и как бы я преобразовал его в новую структуру?

1 Ответ

1 голос
/ 15 апреля 2020

Я проведу вас через компонент сценария, чтобы справиться с этим:

Я предполагаю, что ваш CSV выглядит так, а не html выше:

Date,New York,Washington,London
15-04-2020,2,3,20
16-04-2020,30,50,22

Я назвал этот файл likes.txt и сохранил его на моем D: \

  1. Добавить поток данных
  2. Добавить компонент сценария (источник)
  3. Go на входы и выходы и добавьте свои выходные данные (не забудьте типы данных) enter image description here
  4. Go в сценарий и вставьте следующий код в CreateNewOutputRows:

    string[] lines = File.ReadAllLines(@"d:\likes.txt");
    
    List<string> cities = new List<string>();
    
    int ctr = 0;
    foreach (string line in lines)
    {
        ctr++;
        //skip empty rows
        if(string.IsNullOrWhiteSpace(line)) continue;
    
        //Get Cities from Header
        if (ctr == 1)//Header row
        {
            string[] headers = line.Split(',');
            for (int i = 1; i < headers.Length; i++)
            {
                cities.Add(headers[i]);
            }
            continue; //Go to next line
        }
    
        //Work with details
        string[] pieces = line.Split(',');
        for (int i = 1; i < pieces.Length; i++)
        {
            Output0Buffer.AddRow();
            Output0Buffer.City = cities[i-1];
            Output0Buffer.Date = DateTime.ParseExact(pieces[0].ToString(), "dd-MM-yyyy", CultureInfo.InvariantCulture);
            Output0Buffer.Likes = int.Parse(pieces[i]);
        }
    
    
    }
    
  5. Добавьте следующие пространства имен, чтобы код работал:

      using System.IO;
      using System.Collections.Generic;
      using System.Globalization;
    

Вот ваши результаты: enter image description here

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

PS - Это ответ вируса короны (то есть мне скучно) без каких-либо усилий с вашей стороны. По крайней мере, покажите, что вы пробовали в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...