在CsvHelper中获取记录的长度

时间:2018-10-25 07:52:27

标签: c# csv csvhelper

我正在使用<body>中的CsvHelper库来读取C#文件,如下所示:

CSV

从代码中可以看到,我的问题是我不知道记录中有多少列。由于在解析数据之前我不知道数据的结构(我输入的CSV文件始终是不同的),我如何找出有多少列?我尝试查询var dataCsvFileReader = File.OpenText(inputFile); var dataCsvReader = new CsvReader(dataCsvFileReader); var dataRecords = dataCsvReader.GetRecords<dynamic>(); foreach(dynamic record in dataRecords){ for(int i = 0; i < ???; i++){ //How many columns are there in the record??? Console.WriteLine($"Record {i} value is: {record[i]}"); } } ,但始终返回dataCsvReader.Context.ColumnCount

4 个答案:

答案 0 :(得分:3)

您可以将每条记录转换为List

using (TextReader dataCsvFileReader = File.OpenText(inputFile))
{
    using (CsvReader dataCsvReader = new CsvReader(dataCsvFileReader))
    {
        while (dataCsvReader.Read())
        {
            var dataRecord = Enumerable.ToList(dataCsvReader.GetRecord<dynamic>());
        }
    }
}

答案 1 :(得分:3)

在此列出解决方案,列出并显示动态CSV的值。
为了读取和查找列,您需要一些信息:分隔符,编码(如果文件具有标题)。没有这些,就无法实现这一目标。 在下面的示例中,我使用标头和编码的默认值。

这里的想法是处理将csv转换为List<Dictionary<string, object>>using没有处理来尽快释放StreamReader

List<IDictionary<string, object>> dataRecords  ;

using (TextReader reader = new StreamReader(path))
using (var csvReader = new CsvReader(reader))
{
    csvReader.Configuration.Delimiter = ";";
    dataRecords = csvReader.GetRecords<dynamic>()
                           .Select(x =>  (IDictionary<string, object>)x) 
                           .ToList();
}

foreach (var record in dataRecords)
{
    // Print number of columns, and columns collection.
    Console.WriteLine($"-> {record.Count} Columns {{{string.Join(", ", record.Keys)}}}");
    foreach (var property in record.Keys)
    {
        Console.WriteLine(String.Format("\t{0} : {1}", property, record[property]));
    }
}

为避免可能出现的性能瓶颈拳击,您可以使用字典:

.Select(x => new Dictionary<string, object>((IDictionary<string, object>)x))

结果:

-> 43 Columns {Method, Job, AnalyzeLaunchVariance,...}  
    Method : DiffOriginalNoAny  
    Job : Default  
    AnalyzeLaunchVariance : False  

-> 43 Columns {Method, Job, AnalyzeLaunchVariance,...}  
   Method : DiffOriginal  
   Job : Default  
   AnalyzeLaunchVariance : False  

答案 2 :(得分:1)

您应该记住要做的一件事,就是在访问csv之前先阅读它:

var dataCsvFileReader = File.OpenText(inputFile);
var dataCsvReader = new CsvReader(dataCsvFileReader);
dataCsvReader.Read();
var dataRecords = dataCsvReader.GetRecords<dynamic>();

我建议在这里使用using子句:

var dataCsvFileReader = File.OpenText(inputFile);
using(CsvReader dataCsvReader = new CsvReader(dataCsvFileReader))
{
    //read before accessing csv file
    dataCsvReader.Read();
    //count for columns
    var count = dataCsvReader.Context.ColumnCount;
    var dataRecords = dataCsvReader.GetRecords<dynamic>();
}

答案 3 :(得分:0)

您可以这样做:

        using (var reader = new StreamReader(file))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            while (await csv.ReadAsync())
            {
                var count = csv.Context.Record.Length; // get the length of the record
            }
        }