【发布时间】:2012-01-11 11:26:26
【问题描述】:
我正在尝试找到一种通过 4.0 linq 读取 cvs 字符串的优雅方法,但由于引号之间嵌入了逗号而有些不成功。下面是一个 3 列 3 行的例子:
日期、年份、备忘录文本 "2011-01-01","0.5","备忘录文本
备忘录文本继续
还在继续,然后是逗号,但备忘录是用引号引起来的"
"2010-01-01","0.5","备忘录文本,没有换行符的备忘录"
"2009-01-01","1.0","纯备忘录文本"
到目前为止,我已经提出了以下错误代码作为将其他堆栈交换位组合在一起。这不起作用,因为备忘录文本中的回车换行符将备忘录文本分成多个字段。
using (var reader = new StreamReader(getReader))
{
var records = reader.ReadToEnd().Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
var enumRecords = records.Skip(1).Take(1);
using (var dc = new DataContext())
{
foreach (var record in enumRecords
.Select(x => x.Trim()
.Split(new char[] { ',' }))
.Select(fields => new Entity
{
Date = (!string.IsNullOrEmpty(record.ElementAt(0))) ? Convert.ToDateTime(record.ElementAt(0)) : default(DateTime),
DecimalYears = record.ElementAt(1),
MemoText = record.ElementAt(2)
}))
{
//Commit DataContext
}
}
}
单独使用逗号分割时没有骰子,因为引用的文本之间存在逗号:
using (var reader = new StreamReader(getReader))
{
var sdata = reader.ReadToEnd();
using (var dc = new DataContext())
{
var query = sdata
.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)
.Replace(Environment.NewLine, string.Empty)
.Replace("\"\"", "\",\"")
.Select((i, n) => new { i, n })
.GroupBy(a => a.n / 3)
.Skip(1).Take(1);
foreach (var fields in query)
{
var newEntity = new Entity();
newEntity.Date = (!string.IsNullOrEmpty(fields.ElementAt(0).i)) ? Convert.ToDateTime(fields.ElementAt(0).i) : default(DateTime);
newEntity.DecimalYears = fields.ElementAt(1).i;
newEntity.MemoText = fields.ElementAt(2).i;
}
}
}
到目前为止,似乎一个简单的目标是接近冗长丑陋的代码,可能有人有一个干净而实用的方法来使用 LINQ 来解决这个问题?
【问题讨论】: