基本读取 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。