使用ServiceStack.Text使用CustomHeaders反序列化CSV

时间:2016-04-25 21:49:46

标签: servicestack servicestack-text

我正在尝试使用ServiceStack.Text反序列化包含自定义标头的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");
使用SerializeToString时,

CustomHeadersMap正在运行。但是在使用DeserializeFromString时我无法使其工作。

1 个答案:

答案 0 :(得分:0)

您尝试反序列化的示例文本与Comma-Separated Values(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