8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

没有迭代 foreach 循环,但计数为 1849,应该迭代所有

Alessandro Ballarin AleBalla 1月前

41 0

我正在使用 CsvHelper 读取 CSV 文件。这是我的代码(非常简单):使用(var reader = new StreamReader(\'example.csv\'))使用(var csv = new CsvReader(reader, CultureInfo.InvariantC...

我正在使用 CsvHelper 读取 CSV 文件。

这是我的代码(非常简单):

using (var reader = new StreamReader("example.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
    var records = csv.GetRecords<CsvData>();
    int i = 0;
    foreach (var record in records)
    {                    
        i++;
        Console.WriteLine($"Processed {i}/{records.Count()} records."); 
    }
}
Console.WriteLine("Script finished");

问题是我的代码没有循环 foreach,所以它不会打印任何东西...我在线上设置了一个断点, i++; 但它没有中断。

如果我打印 records.Count() 它将返回 3:

enter image description here

这可能是一个 CSV 文件的示例:

enter image description here

代码格式,方便您复制:

Size,Color
8,Yellow
2,Orange
13,Blue

这可能是 CsvData 类的一个例子:

public class CsvData
{        
    public decimal? Size { get; set; }
    public string Color { get; set; }
}

我应该如何将我的行解析迭代到我的 CsvData 类中以创建 List<CsvData> 或类似?

帖子版权声明 1、本帖标题:没有迭代 foreach 循环,但计数为 1849,应该迭代所有
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Alessandro Ballarin AleBalla在本站《c#》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @Joel Coehoorn 是正确的。只要您调用 .Count() ,您就等于被告知 CsvHelper 要读取整个 CSV 文件,以便找出文件中有多少条记录。现在您处于数据流的末尾,没有更多记录需要读取。调用 执行 .ToList() 相同的操作。它会读取整个 CSV 文件,但这次它会将记录保存到变量中的内存中 records 。如果您的文件较小,这没问题,但如果文件非常大,您可能会遇到内存问题。

    根据 入门说明

    GetRecords<T> 方法将返回一个 IEnumerable<T> 将产生记录的 。这意味着当您迭代记录时,一次只返回一条记录。这也意味着只有一小部分文件被读入内存。但要小心。如果您执行任何执行 LINQ 投影的操作,例如调用 .ToList() ,整个文件将被读入内存。 CsvReader 是仅向前的,因此如果您想针对数据运行任何 LINQ 查询,您必须将整个文件拉入内存。只要知道这就是你在做的事情。

    选项 1

    您已经发现您可以调用 List<CsvData> records = csv.GetRecords<CsvData>().ToList(); 并将所有记录放入内存中。只需了解您正在做的事情即可。我还会将您的计数放入变量中, var count = records.count(); 而不是让您的代码每次循环 List<CsvData> 以获取计数。

    选项 2

    不要一开始就给出计数。最后给出总数即可。

    选项 3

    循环遍历文件两次。第一次获取计数,第二次获取数据。

    void Main()
    {
        var count = 0;
    
        using (var reader = new StreamReader("example.csv"))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            count = csv.GetRecords<CsvData>().Count();
        }
        
        using (var reader = new StreamReader("example.csv"))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            var records = csv.GetRecords<CsvData>();
            int i = 0;
            foreach (var record in records)
            {
                i++;
                Console.WriteLine($"Processed {i}/{count} records.");
            }
        }
    }
    
    public class CsvData
    {
        public int Size { get; set; }
        public string Color { get; set; }
    }
    
返回
作者最近主题: