Несколько CSV-структур с FileHelpers - PullRequest
2 голосов
/ 10 января 2012

Я делаю сайт, который использует CSV-файл, этот файл может быть в 2 форматах (возможно, больше в будущем).

Структура 1

Header 1 Header 2 Header 3 Header 4 
a          b      c       d
x          x      x       x

Структура 2

Header 1 Header 4
a          d
x          x

Выше показано, как это будет показано в Excel (если смотреть на raw, все будет разделено запятыми)

Причина, по которой я хочу иметь 2 структуры, заключается в том, что я пытаюсь использовать сторонний сайт, с которого пользователь может экспортировать свои данные. Этот сайт экспортирует его в виде CSV-файла с первой строкой заголовков. Я действительно забочусь только о 2 из заголовков, и в настоящее время сброс не требуется (но вы должны экспортировать все столбцы, которые невозможно выбрать).

Вторая структура, если пользователь не хочет использовать этот сайт, потому что он не хочет, неудобно делать это и т. Д. У него есть возможность открыть Excel и записать данные вручную, а затем сохранить их. как CSV-файл.

Так что для людей, работающих в ручном режиме, я хочу сделать это как можно более простым, как если бы я не использовал данные заголовка 2 и заголовка 4, зачем мне их заставлять вводить их? Однако в то же время, если люди идут первым путем и экспортируют данные, я не хочу, чтобы им приходилось загружать файл в excel up и удалять 2 столбца.

Я собираюсь требовать, чтобы заголовок всегда был целым и был первым рядом. Единственная идея, которая мне пришла в голову - это прочитать первый ряд и посмотреть порядок заголовков. Если у него есть 4 заголовка в точном порядке, то выведите его в одну сторону. Если только 2 заголовка в этом порядке отображают его по-другому.

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

У кого-нибудь есть идея, могу ли я сделать это с помощью filehelpers?

Редактировать это то, что я до сих пор

MultiRecordEngine engine = new MultiRecordEngine(typeof(Format2), typeof(Format1));
    engine.RecordSelector = new RecordTypeSelector(CustomSelector);

    using (TextReader textReader = new StreamReader(stream))
    {
        if (engine.RecordType == typeof(Format2))
        {
            var myArry = engine.ReadStream(textReader) as Format2[];

        }
        else if(engine.RecordType == typeof(Format1))
        {
            var myArry = engine.ReadStream(textReader) as Format1[];
        }



    }

Ответы [ 2 ]

5 голосов
/ 10 января 2012

Вот несколько предложенных подходов:

Прочитайте первую строку файла (вне FileHelpers) и определите, какой формат используется до создания движка

if (firstLineOfFile.Contains("Header 2"))
    FileHelperEngine engine = new FileHelperEngine(typeof(Format1)); 
else
    FileHelperEngine engine = new FileHelperEngine(typeof(Format2)); 

В качестве альтернативы вы можете использовать MultiRecordEngine

MultiRecordEngine engine;  
engine = new MultiRecordEngine(typeof(Format1), typeof(Format2)); 
engine.RecordSelector = new RecordTypeSelector(CustomSelector); 

с методом селектора что-то вроде

Type CustomSelector(MultiRecordEngine engine, string record) 
{ 
    // count the separators to determine which format to return
    int separatorCount = record.Count(f => f == ',');
    if (separatorCount == 4) 
        return typeof(Format1); 
    else 
        return typeof(Format2); 
} 

(MultiRecordEngine может обрабатывать больше форматов в будущем - у него есть конструктор с параметром params)

1 голос
/ 10 января 2012

С FileHelpers вам нужно знать формат заранее.

Это означает, что вам придется определить (используя метод, который вы описали), в каком формате находится файл, прежде чем использовать FileHelpers для его анализа.

...