我正在使用 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:
这可能是一个 CSV 文件的示例:
代码格式,方便您复制:
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>
或类似?
@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; }
}