将CSV解析为模型
问题描述:
我试图将CSV
解析为Model,但我的IEnumerable
始终为空。这段代码有什么问题吗?将CSV解析为模型
private IEnumerable<CandidatesDTO> FileToDto(byte[] file)
{
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
IEnumerable<CandidatesDTO> query = null;
string[] separators = { ",", ".", "!", "?", ";", ":", " " };
try
{
var str = enc.GetString(file);
query = from line in str
let data = str.Split(separators, StringSplitOptions.RemoveEmptyEntries)
select new CandidatesDTO
{
Id = Int32.Parse(data[0]),
Name = data[1],
DOB = DateTime.Parse(data[2], CultureInfo.InvariantCulture),
Phone = data[3],
Email = data[4]
};
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return query;
}
UPDATE。我发现有异常 - “输入字符串格式不正确”。看起来像一些不正确的类型是通过字符串传递的,这导致了FormatException。
答
从查看代码,我认为linq将str
视为IEnumerable<char>
。您可能需要执行str.Split("\r\n")
或任何行分隔符,以便您可以获取每行代码。
private IEnumerable<CandidatesDTO> FileToDto(byte[] file)
{
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
IEnumerable<CandidatesDTO> query = null;
string[] separators = { ",", ".", "!", "?", ";", ":", " " };
try
{
var str = enc.GetString(file);
query = from line in str.Split(new [] {"\n\r"}, StringSplitOptions.RemoveEmptyEntries)
let data = line.Split(separators, StringSplitOptions.RemoveEmptyEntries)
select new CandidatesDTO
{
Id = Int32.Parse(data[0]),
Name = data[1],
DOB = DateTime.Parse(data[2], CultureInfo.InvariantCulture),
Phone = data[3],
Email = data[4]
};
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return query;
}
+0
你是对的 - 几个数组元素中有\ n \ r符号,这导致了FormatException。 –
请分享您的CSV文件的内容,以及 –
我可以建议你到F#项目添加到您当前的解决方案。然后,您可以利用CSV类型提供程序的优势,详细信息请参阅http://fsharp.github.io/FSharp.Data/library/CsvProvider.html 除此之外,使用F#还可以快速且轻松地定义DTO –
该文件必须为空。你至少应该有一个候选人在查询,你有空。 – jdweng