提问者:小点点

如何访问csv helper中的记录


下面的代码读取csv文件的一列。这是正确的。我想将var记录复制到十进制数组。我正在使用csv助手。怎样做最好?

using (var reader = new StreamReader(filename))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    var records = new List<Filevalues>();
    csv.Read();
    csv.ReadHeader();
    while (csv.Read())
    {
        var record = new Filevalues
        {            
            File_vals = csv.GetField<decimal>("File_vals"),   
        };

        records.Add(record);
    }
}

public class Filevalues
{
    public decimal File_vals{ get; set; }
}

共2个答案

匿名用户

最简单的是:

using var csv = new CsvReader(new StreamReader(filename), CultureInfo.InvariantCulture));
csv.GetRecords<Filevalues>().Select(f => f.File_vals).ToArray();

(我想我应该列出()它而不是数组,然后使用列表)

如果CSV非常简单,只是一个小数列表,我可能会跳过使用CSV库:

File.ReadLines(path).Skip(1).Select(decimal.Parse).ToArray();

匿名用户

要么:

using (var reader = new StreamReader(filename))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    var listOfDecimals = new List<decimal>();
    csv.Read();
    csv.ReadHeader();
    while (csv.Read())
    {
        listOfDecimals.Add(csv.GetField<decimal>("File_vals"));
    }

    var arrayOfDecimals = listOfDecimals.ToArray();
}

今天:https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.toarray

或:

using (var reader = new StreamReader(filename))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    var records = new List<Filevalues>();
    csv.Read();
    csv.ReadHeader();
    while (csv.Read())
    {
        var record = new Filevalues
        {
            File_vals = csv.GetField<decimal>("File_vals"),   
        };
        records.Add(record);
    }

    var arrayOfDecimals = records.Select(x => x.File_vals).ToArray();
}

public class Filevalues
{
    public decimal File_vals{ get; set; }
}

LINQ投影:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/projection-operations