我正在尝试使用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时我无法使其工作。
答案 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