c # FileHelpers загружает в DataTable CSV с линиями переменной длины - PullRequest
0 голосов
/ 03 мая 2018

После этого поста , который подходит для ответа на мой вопрос, мне нужна помощь в настройке FileHelpers. У меня есть банковские выписки с некоторой дополнительной информацией над фактическими данными транзакции, поэтому файл выглядит следующим образом:

Some Header 1,Some Header 2,And Header 3
<summary of the entire file on 5 lines>

Date,Transaction Type,Description,Amount,Running Balance
<actual transaction data, on 5 columns each line>

Я заинтересован в захвате всех полей (в DataTable), включая сводку. По сути, я бы хотел, чтобы размер данных определялся в соответствии с максимальным количеством столбцов в любой строке.

Прасант предложил альтернативу, но я не понимаю, что такое _fileContent:

using (MemoryStream stream = new MemoryStream(_fileContent)) //file content can be file as byte array

Я годами писал код на VBA и недавно запустил Excel Com-AddIn на c #, так что я скорее новичок.

Заранее спасибо! Dani

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

FileHelpers MultiRecordEngine может помочь с этим, при условии, что вы можете написать селектор записей, который может просматривать строковую запись и выбирать формат, который вы хотите использовать для чтения строки.

Как правило, это работает лучше всего, когда у вас есть очевидный индикатор типа записи - в этом случае первый символ строки указывает тип записи:

 if (recordLine.Length == 0)
            return null;  // no record will be read

        int action = int.Parse(recordLine.Substring(0, 1));
        switch (action) {
            case 0:
            case 1:
                return typeof(RecTypeOne);
            case 2:
                return typeof(RecTypeTwo);
            case 3:
                return typeof(RecTypeThree);

            default:
                return null;  // again, no record is read

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

0 голосов
/ 05 мая 2018

С Cinchoo ETL - библиотекой с открытым исходным кодом, вы можете загрузить CSV-файл переменной длины. Пример ниже показывает, как

string csv = @"Id, Name, City
    1, Tom, NY
    2, Mark, NJ, 100
    3, Lou, FL
    4, Smith, PA
    5, Raj, DC";

StringBuilder sb = new StringBuilder();
using (var p = ChoCSVReader.LoadText(csv)
    .WithFirstLineHeader(true) //Ignore the header line to handle the variable length CSV lines
    .Configure(c => c.MaxScanRows = 5) //Set the max scan rows to the highest to figure out the max fields
    .Configure(c => c.ThrowAndStopOnMissingField = false)
    )
{
    foreach (var rec in p)
        Console.WriteLine(rec.DumpAsJson());    
}

Закажите статью CodeProject для получения дополнительной помощи.

Отказ от ответственности: я являюсь автором этой библиотеки.

...