4 Stimmen

FileHelpers: Mischen von Datensätzen mit Begrenzungen und fester Länge

Hier muss ich eine Datei schreiben, deren Datensätze durch Pipe getrennt sind, unter Verwendung von FileHelpers und C#. Ein großer Teil der Felder hat variable Länge (daher würden meine Datensätze [DelimitedRecord("|")] sein). Aber einige Felder müssen feste Länge haben (sie müssen mit Leerzeichen aufgefüllt werden, spezifisches Format usw.).

Ich habe eine Menge gegoogelt, aber kein Ziel erreicht, wie ich das erreichen kann.

Beispiel:

[DelimitedRecord("|")]
public class Kunde
{
    public int CustId; // variable Länge

    public string Name; // variable Länge

    public decimal Balance; // variable Länge

    [FieldConverter(ConverterKind.Date, "dd-MM-yyyy")]
    public DateTime AddedDate;

    public int Code; // dieses muss 10 Zeichen mit "Nullenfüllung" haben, z. B.
             // 153 muss wie 0000000153 aussehen

}

Wie kann ich das erreichen? Muss ich einen Konverteransatz verwenden und meinen eigenen Konverter dafür schreiben?

Vielen Dank im Voraus.

6voto

Slider345 Punkte 4278

Für alle, die in Zukunft auf diese Frage stoßen, hier ist funktionierender Code zur Lösung dieses Problems.

Diese Klasse ist ein Konverter, den das FileHelper-Modul verwenden wird, um die Ganzzahl in einen String umzuwandeln, der mit 0en auf die im Konstruktor angegebene Größe aufgefüllt ist.

public class PaddedIntConverter:ConverterBase
{
    private int _size;
    public PaddedIntConverter(int size)
    {
        _size = size;
    }

    public override object StringToField(string from)
    {
        return int.Parse(from);
    }

    public override string FieldToString(object from)
    {
        return from.ToString().PadLeft(_size,'0');
    }
}

Der Konverter kann dann auf Ihre Klasse angewendet werden, wie folgt:

[FixedLengthRecord(FixedMode.ExactLength)]
public class MyClass{
    [FieldFixedLength(7)]
    [FieldConverter(typeof(PaddedIntConverter), 7)]
    public int RecordCount;
}

1voto

TYY Punkte 2692

FileHelpers hat ein Attribut [FieldFixedLength(xxx)], ich glaube, das sollte Ihnen geben, wonach Sie suchen (http://filehelpers.sourceforge.net/attributes.html).

0voto

cezarlamann Punkte 1364

Wie von @TYY erwähnt, habe ich meinen eigenen "Multiuse"-Konverter geschrieben, genau wie folgt:

    public StringNumberCharConverter(
        string Size, 
        string PaddingChar, 
        string PaddingType, 
        string RemoveSpecialChars)
    { 
        //Implementierung hier 
    }

Da FileHelpers-Konverter nur Zeichenfolgenargumente akzeptieren, musste ich alles innerhalb des Konstruktor des Konverters in geeignete Objekte umwandeln.

Bei den Parametern habe ich "Size" in eine "integer", PaddingChar in ein "char", PaddingType in ein benutzerdefiniertes ENUM für den Polstertyp umgewandelt (d. h.: Padding.LEFT oder Padding.RIGHT, so dass, wenn ein "links" aus den Parametern kommt, String.PadLeft() verwendet werden sollte usw.), und der Parameter "RemoveSpecialChars" wurde in ein Boolean umgewandelt (Flagge zum Überprüfen, ob der Konverter Sonderzeichen entfernen soll oder nicht).

Da ich eine Objekt-zu-Datei-Konvertierung benötige, befindet sich die gesamte Konvertierungslogik innerhalb der Implementierung der Methode "FieldToString" der abstrakten Methode ConverterBase.

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