Я пытаюсь найти элегантный способ чтения строки cvs через 4.0 linq, и мне это не помогло из-за запятых между кавычками.Вот пример из 3 столбцов и 3 строк:
Дата, Годы, MemoText "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?