2016-04-25 2 views
0

カスタムヘッダーを含むcsvファイルをデシリアライズするためにServiceStack.Textを使用しようとしています。ServiceStack.Textを使用してCustomHeadersでCSVを非直列化する

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は、SerializeToStringが使用されている場合に機能します。しかし、私はDeserializeFromStringを使用しているときに動作させることはできません。

答えて

0

デシリアライズしようとしているサンプルテキストは、デシリアライズにServiceStack's CSV Formatを使用するComma-Separated Values(CSV)形式とほとんど共通しません。

サンプルのテキスト形式を逆シリアル化できる.NETライブラリがないので、適切な.csvファイルに変換できるカスタム正規表現/正規化ツールを使用して実行することをおすすめします。代わりにそれをデシリアライズします。

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') 

csvは今の文字列が含まれています:

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

例が間違ったセパレータを持っていた、それは今正しいはずここでは、JavaScriptでの例です。デシリアライザでCustomHeadersMapが使用されていますか? –

+0

@ Kai-Runeサンプルテキストはまったく同じように見えますか?つまり、CSVに近いものはありません。私は答えを例で更新しました。これらのカスタムヘッダーをCSVデシリアライザにも適用するだけです(https://github.com/ServiceStack/ServiceStack.Text/commit/6085b45e63520f788d1d0b0b748cd2541e37e652)。この変更はMyGetのv4.0.57から利用できますが、最新のものを取得するには[MyGetキャッシュをクリアする](https://github.com/ServiceStack/ServiceStack/wiki/MyGet#redownloading-myget-packages)が必要ですパッケージのバージョン。 – mythz

+0

更新されたnugetパッケージでエラーが発生する場合は、質問のコードを実行してください。 csvデータはコードに含まれています。 –

関連する問題