基本读取 CSV 文件问题
Basic Read CSV File Questions
提前致谢,C# 新手遇到了一些问题。
我这个CSV文件每天提供,很大,没有header。我只需要此文件中的某些项目。
这是我目前的代码。
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
};
using (var reader = new StreamReader(iFile.FileName))
using (var csv = new CsvReader(reader, config))
{
var records = new List<BQFile>();
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
var record = new BQFile()
{
SNumber = csv.GetField<string>("SNumber"),
FOBPoint = csv.GetField<string>("FOBPoint")
};
}
自从这个 CSV 文件包含 150 多个字段以来,我不明白的是如何获取正确的数据。例如,如果 SNumber 是第 46 列,则 FOBPoint 是第 123 列。我发现 CSVHelper 文档对我来说有点受限。
感谢任何帮助。
What I am not understanding since this CSV files 150+ fields, is how do grab the correct data
按索引,因为没有header
在您的 BQFile 中,使用属性 [Index(NNN)]
修饰属性,其中 N 是列号(从 0 开始)。 IndexAttribute
位于 CsvHelper.Configuration.Attributes
命名空间中——我提到这个是因为 Entity Framework 也有一个 Index 属性;确保你使用正确的
pubic class BQFile{
[Index(46)]
public string SNumber { get; set;}
...
}
然后做:
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
};
using (var reader = new StreamReader(iFile.FileName))
using (var csv = new CsvReader(reader, config))
{
var records = csv.GetRecords<BQFile>();
...
records
是文件流顶部的 枚举 (通过 CSVHelper,它会读取记录并创建 BQFile 实例)。你只能枚举它一次,然后在你完成枚举之后文件流将在最后 - 如果你想重新读取文件你必须寻找流或更新 reader
。此外,该文件仅在您枚举 时被读取(以块的形式逐步读取)。如果你在某个地方 return records
,所以你退出 using
并因此处理 reader,当你尝试从 [开始阅读时,你会得到一个错误=17=](因为它被处置了)
要使用 records
,您要么 foreach
它,一边处理您获得的对象:
foreach(BQFile bqf in records){
//do stuff with each BQFile here
}
或者如果你想将它全部加载到内存中,你可以做类似 ToList()
这样的事情,这样你最终会在一个列表中得到一堆 BQFile,然后你可以,例如随机访问它们,一遍又一遍地阅读它们等等。
var bqfs = records.ToList();
ps;我不知道,当你说“它是第 46 列”时,是从 1 还是 0 开始计数。你可能需要调整你的 46。
提前致谢,C# 新手遇到了一些问题。
我这个CSV文件每天提供,很大,没有header。我只需要此文件中的某些项目。
这是我目前的代码。
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
};
using (var reader = new StreamReader(iFile.FileName))
using (var csv = new CsvReader(reader, config))
{
var records = new List<BQFile>();
csv.Read();
csv.ReadHeader();
while (csv.Read())
{
var record = new BQFile()
{
SNumber = csv.GetField<string>("SNumber"),
FOBPoint = csv.GetField<string>("FOBPoint")
};
}
自从这个 CSV 文件包含 150 多个字段以来,我不明白的是如何获取正确的数据。例如,如果 SNumber 是第 46 列,则 FOBPoint 是第 123 列。我发现 CSVHelper 文档对我来说有点受限。
感谢任何帮助。
What I am not understanding since this CSV files 150+ fields, is how do grab the correct data
按索引,因为没有header
在您的 BQFile 中,使用属性 [Index(NNN)]
修饰属性,其中 N 是列号(从 0 开始)。 IndexAttribute
位于 CsvHelper.Configuration.Attributes
命名空间中——我提到这个是因为 Entity Framework 也有一个 Index 属性;确保你使用正确的
pubic class BQFile{
[Index(46)]
public string SNumber { get; set;}
...
}
然后做:
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
};
using (var reader = new StreamReader(iFile.FileName))
using (var csv = new CsvReader(reader, config))
{
var records = csv.GetRecords<BQFile>();
...
records
是文件流顶部的 枚举 (通过 CSVHelper,它会读取记录并创建 BQFile 实例)。你只能枚举它一次,然后在你完成枚举之后文件流将在最后 - 如果你想重新读取文件你必须寻找流或更新 reader
。此外,该文件仅在您枚举 时被读取(以块的形式逐步读取)。如果你在某个地方 return records
,所以你退出 using
并因此处理 reader,当你尝试从 [开始阅读时,你会得到一个错误=17=](因为它被处置了)
要使用 records
,您要么 foreach
它,一边处理您获得的对象:
foreach(BQFile bqf in records){
//do stuff with each BQFile here
}
或者如果你想将它全部加载到内存中,你可以做类似 ToList()
这样的事情,这样你最终会在一个列表中得到一堆 BQFile,然后你可以,例如随机访问它们,一遍又一遍地阅读它们等等。
var bqfs = records.ToList();
ps;我不知道,当你说“它是第 46 列”时,是从 1 还是 0 开始计数。你可能需要调整你的 46。