CSV для сопоставления объектной модели
У меня есть файл CSV, который я хочу прочитать в списке. Вот пример файла:
Plant,Material,"Density, Lb/ft3",Storage Location
FRED,10000477,64.3008,3300
FRED,10000479,62.612,3275
FRED,10000517,90,3550
FRED,10000517,72,3550
FRED,10000532,90,3550
FRED,10000532,72,3550
FRED,10000550,97,3050
Я знаю, что могу вручную читать в CSV файле и строить список с помощью обычного StreamReader, но мне было интересно, есть ли лучший способ, возможно, используя LINQ?
Ответы
Ответ 1
Вы можете использовать простой код, подобный этому, который игнорирует заголовок и не работает с кавычками, но может быть достаточным для ваших нужд.
from line in File.ReadAllLines(fileName).Skip(1)
let columns = line.Split(',')
select new
{
Plant = columns[0],
Material = int.Parse(columns[1]),
Density = float.Parse(columns[2]),
StorageLocation = int.Parse(columns[3])
}
Или вы можете использовать библиотеку, как и другие.
Ответ 2
Для конкретных данных, указанных в вашем вопросе...
var yourData = File.ReadAllLines("yourFile.csv")
.Skip(1)
.Select(x => x.Split(','))
.Select(x => new
{
Plant = x[0],
Material = x[1],
Density = double.Parse(x[2]),
StorageLocation = int.Parse(x[3])
});
Если у вас уже есть тип, объявленный для ваших данных, вы можете использовать его, а не анонимный тип.
Обратите внимание, что этот код не является надежным вообще. Он неправильно обрабатывает значения, содержащие запятые/новые символы и т.д., Цитированные строковые значения или любые другие эзотерические материалы, которые часто встречаются в файлах CSV.
Ответ 3
Вот код для этого:
http://www.codeproject.com/KB/linq/LINQtoCSV.aspx
Однако вы можете посмотреть здесь:
Линии Linq и потоковое чтение
Ответ 4
Я написал простую библиотеку, чтобы позволить разработчикам использовать LINQ для CSV файлов. Вот мое сообщение в блоге об этом: http://procbits.com/2010/10/11/using-linq-with-csv-files/
В вашем случае вам придется изменить строку заголовка, чтобы выглядеть так:
Plant,Material,DensityLbft3,StorageLocation
И тогда вы можете проанализировать файл следующим образом:
var linqCSV = new CsvToXml("csvfile", true);
linqCsv.TextQualifier = null;
linqCsv.ColumnTypes.Add("Plant", typeof(string));
linqCsv.ColumnTypes.Add("Material", typeof(int));
linqCsv.ColumnTypes.Add("DensityLbft3", typeof(double));
linqCsv.ColumnTypes.Add("StorageLocation", typeof(int));
linqCsv.Convert();
Затем вы можете использовать LINQ следующим образом:
var items = from item in linqCsv.DynamicRecords
where item.Plant == "Fred" && item.DensityLbft3 >= 62.6
orderby item.StorageLocation
select item;
Надеюсь, что это помогает или работает для вас.
Ответ 5
Он не использует LINQ, но CsvHelper - это простой метод для реализации анализа CSV для объекта .NET:
using (TextReader txt = new StreamReader(filename))
{
using (var csv = new CsvReader(txt))
{
var records = csv.GetRecords<PlantMaterial>();
return records.ToList();
}
}
Ответ 6
С библиотекой Cinchoo ETL можно анализировать CSV файл на объекты
Определите тип файла, соответствующий структуре файла CSV, как показано ниже
public class PlantType
{
public string Plant { get; set; }
public int Material { get; set; }
public double Density { get; set; }
public int StorageLocation { get; set; }
}
Загрузить файл CSV
static void LoadCSV()
{
using (var p = new ChoCSVReader<PlantType>("*** YOUR CSV FILE PATH ***")
.WithFirstLineHeader(true)
)
{
foreach (var rec in p)
{
Console.WriteLine(rec.Dump());
}
}
}