10 Stimmen

FileHelpers und CSV: Was tun, wenn ein Datensatz horizontal unbegrenzt erweitert werden kann

Ich versuche, diese Art von CSV-Datei mit FileHelpers zu parsen:

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

Ich kann nicht herausfinden, wie ich das mit FileHelpers parsen kann. Ich würde mir vorstellen, dass ich etwas wie das hier tun sollte:

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

    public List Values;
}

Aber das scheint mit FileHelpers nicht möglich zu sein. Das Beste, was ich anscheinend tun kann, ist dies:

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

    public string Values;

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

Dann müsste ich Values nach Kommas aufteilen, um den Satz von Werten für jeden Datensatz zu erhalten. Es scheint nicht viel Sinn zu machen, FileHelpers zu verwenden, wenn ich einen Teil jedes Datensatzes manuell parsen muss.

Übersehe ich etwas? Ich habe die Dokumentation/Beispiele durchgelesen, kann aber keine Lösung für mein Format finden. Excel hat kein Problem mit meinem Format, also würde ich erwarten, dass es einen Weg gibt, es mit einer vorhandenen kostenlosen Bibliothek (FileHelpers oder einer anderen Bibliothek) zu tun. Irgendwelche Ideen?

13voto

Marcos Meli Punkte 3408

Sie können ein Array-Feld verwenden und die Bibliothek macht die Arbeit:

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

    public int[] Values;
}

Sie können sogar [FieldArrayLength(2, 8)] verwenden

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

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

Legen Sie die Mindest- und Höchstanzahl von Werten fest

Ich empfehle dringend, die letzte Version der Bibliothek von hier herunterzuladen:

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

Überprüfen Sie den Abschnitt Artefakte

1voto

marc_s Punkte 701497

Sie könnten eine Klasse MyRecord erstellen, die alle potenziellen Werte enthält, z.B.

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

und die meisten dieser Felder optional machen (Nr. 5 bis 14 in meinem Beispiel) und das z.B. mit einem FieldNullValue kombinieren, um mit den nicht vorhandenen Feldern umzugehen (oder machen Sie diese optionalen Felder zu einem nullable int:

 public int? Value5

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X