2016-04-25 81 views
0

我想使用ServiceStack.Text反序列化包含自定义标题的csv文件。使用ServiceStack.Text反序列化CSV与CustomHeaders

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"); 

使用SerializeToString时,CustomHeadersMap正在工作。但是在使用DeserializeFromString时我无法正常工作。

回答

0

您试图反序列化的示例文本与(CSV)格式的ServiceStack's CSV Format应该用于反序列化的格式很少有共同之处。

我不知道可以反序列化的文本格式在你的样品任何.NET库,所以我建议你通过一些定制的正则表达式/正规化运行它,可以将其转换为一个适当的的.csv文件和相反,反序列化。下面是在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') 

哪里csv现在包含字符串:

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

的例子有一个错误的分离器,它现在应该是正确的。在解串器中使用CustomHeadersMap? –

+0

@ Kai-Rune的示例文字看起来像完全一样吗?即没有接近CSV,我用一个例子更新了我的答案。我也只是[添加了一个提交](https://github.com/ServiceStack/ServiceStack.Text/commit/6085b45e63520f788d1d0b0b748cd2541e37e652),它也将这些自定义标头应用于CSV解串器。此更改现已在MyGet上的v4.0.57中提供,但您需要[清除MyGet缓存](https://github.com/ServiceStack/ServiceStack/wiki/MyGet#redownloading-myget-packages)以获取最新包版本。 – mythz

+0

我仍然遇到更新的nuget包的错误,请运行问题中的代码。 csv数据包含在代码中。 –