FileHelpers и CSV: что делать, когда запись может расширяться неограниченно по горизонтали - PullRequest
9 голосов
/ 01 марта 2010

Я пытаюсь проанализировать этот тип файла CSV с FileHelpers:

Tom,1,2,3,4,5,6,7,8,9,10
Steve,1,2,3
Bob,1,2,3,4,5,6
Cthulhu,1,2,3,4,5
Greg,1,2,3,4,5,6,7,8,9,10,11,12,13,14

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

[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;

    public List<int> Values;
}

Но это не представляется возможным с FileHelpers. Лучшее, что я могу сделать, это:

[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;

    public string Values;

    public string[] ActualValuesInNiceArray
    {
        get { return Values.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries); }
    }
}

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

Я что-то упустил? Я просмотрел документы / примеры, но не могу найти решение для своего формата. У Excel нет проблем с моим форматом, поэтому я думаю, что есть способ сделать это с помощью существующей бесплатной библиотеки (FileHelpers или какой-либо другой библиотеки). Есть идеи?

Ответы [ 2 ]

12 голосов
/ 01 марта 2010

Вы можете использовать Поле массива , и библиотека сделает всю работу:

[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;

    public int[] Values;
}

Вы даже можете использовать [FieldArrayLength (2, 8)]

[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;

    [FieldArrayLength(2, 8)]
    public int[] Values;
}

Набор минимального / максимального количества значений

Я настоятельно рекомендую скачать последнюю версию библиотеки отсюда:

http://teamcity.codebetter.com/viewType.html?buildTypeId=bt65&tab=buildTypeStatusDiv

Проверьте раздел артефактов

1 голос
/ 01 марта 2010

Вы можете создать класс MyRecord, который содержит все потенциальные значения, например,

[DelimitedRecord(",")]
public class MyRecord
{
    public string Name;
    public int Value1;
    .....
    [FieldOptional]
    public int Value5;
    ......
    [FieldOptional]
    [FieldNullValue(typeof(int), "-1" )]
    public int Value14;
}

и сделайте большинство этих полей необязательными (в моем примере это номера с 5 по 14) и объедините их, например, с. FieldNullValue для обработки этих несуществующих полей (или сделать эти необязательные поля обнуляемыми int:

 public int? Value5
...