2016-04-25 5 views
0

Ich versuche, ServiceStack.Text zum Deserialisieren einer CSV-Datei mit benutzerdefinierten Headern zu verwenden.CSV mit CustomHeaders mithilfe von ServiceStack.Text deserialisieren

var csv = "Col-1,Col-2" + Environment.NewLine + 
"Val1,Val2" + Environment.NewLine + 
"Val3,Val3" + Environment.NewLine; 

public class Line 
{ 
    public string Col1 { get; set; } 
    public string Col2 { get; set; } 
} 

ServiceStack.Text.CsvConfig<Line>.CustomHeadersMap = new Dictionary<string, string> { 
    {"Col1", "Col-1"}, 
    {"Col2", "Col-2"} 
}; 

var r2 = ServiceStack.Text.CsvSerializer.DeserializeFromString<List<Line>>(csv); 

Assert.That(r2.Count() == 2, "It should be 2 rows"); 
Assert.That(r2[0].Col1 == "Val1", "Expected Val1"); 
Assert.That(r2[0].Col2 == "Val2", "Expected Val2"); 

CustomHeadersMap funktioniert, wenn SerializeToString verwendet wird. Aber ich kann es nicht funktionieren, wenn DeserializeFromString verwendet.

Antwort

0

Der Beispieltext Sie versuchen, hat deserialisieren sehr wenig gemein mit dem Comma-Separated Values (CSV) Format, das ServiceStack's CSV Format sollte deserialisieren verwendet werden.

Ich bin nicht bekannt, dass .NET-Bibliothek, die das Textformat in Ihrem Beispiel deserialisieren kann so würde ich empfehlen, es durch einige eine benutzerdefinierte regex/normalizer ausgeführt, die es zu einer richtigen CSV-Datei umwandeln kann und deserialisieren das stattdessen. Hier ist ein Beispiel in JavaScript:

var txt = `--------------- 
| Col-1 | Col-2 | 
--------------- 
| Val1 | Val2 | 
--------------- 
| Val3 | Val4 | 
--------------- 
`; 

var csv = txt 
    .replace(/^-*/mg, '') 
    .replace(/(^\| | \|$)/mg, '') 
    .replace(/ \| /mg,',') 
    .split(/\r?\n/g) 
    .filter(s => s) 
    .join('\r\n') 

Wo csv jetzt die Zeichenfolge enthält:

Col-1,Col-2 
Val1,Val2 
Val3,Val4 
+0

Das Beispiel einen falschen Separator hatte, soll es jetzt korrekt sein. Wird CustomHeadersMap im Deserializer verwendet? –

+0

@ Kai-Rune der Beispieltext sieht genauso aus? d. h. nichts in der Nähe von CSV, ich habe meine Antwort mit einem Beispiel aktualisiert. Ich habe auch [commited] (https://github.com/ServiceStack/ServiceStack.Text/commit/6085b45e63520f788d1d0b0b748cd2541e37e652), die diese benutzerdefinierten Header auch auf den CSV Deserializer anwendet. Diese Änderung ist jetzt ab v4.0.57 auf MyGet verfügbar, aber Sie müssen [MyGet-Cache löschen] (https://github.com/ServiceStack/ServiceStack/wiki/MyGet#redownloading-myget-packages), um die neueste Version abzurufen Paketversionen. – mythz

+0

Ich bekomme immer noch einen Fehler mit dem aktualisierten nuget-Paket, bitte führen Sie den Code in der Frage. Die CSV-Daten sind im Code enthalten. –

Verwandte Themen