首页 > 解决方案 > 在 C# .NET 中读取 CSV 而无需输入字段名称

问题描述

我需要读取一个 CSV 文件以用作 C# .NET 框架中的数组。相当于例如

var animalList = new List<Animal>()
{
    new Animal{Name = "German Shepherd",
    Height = 25,
    Weight = 77},
    new Animal{Name = "Chihuahua",
    Height = 7,
    Weight = 4.4},
};

但存储并从具有列的 CSV 文件中读取Name, Height, Weight. 我可以在线查看使用和不使用软件包的方法,例如使用Lumen CSV Reader软件包。但是,我有两个问题:

  1. 理想情况下,我想在不安装任何东西的情况下执行此操作(例如 Lumen CSV Reader 包)
  2. 我的 CSV 有数千个字段,所以其中的部分
public class SearchParameters  
    {  
        public string FirstName{ get; set; }  
        public string LastName{ get; set; }  
        public string Email{ get; set; }  
    }  

在教程中写是不切实际的,因为我不想写出所有的字段名称。我想从 CSV 的标题中读取它们。有人知道怎么做吗?

CSV 文件非常大(最多大约 1,000 列和 20,000 行 - 大多数元素都是布尔值:True 或 False)。读入它们不一定是世界上最有效的事情(但我需要 System.LINQ 以最大速度查询最终数组)。

标签: c#.netcsv

解决方案


有些包确实允许使用某种记录类型处理 csv 文件,然后您可以通过索引/标题名称读取(找不到我记得的那个)。但考虑到输入的大小,我不确定常规 csv 反序列化器的性能如何。

请考虑,如果没有基础类来表示记录,那么在某些时候您将不得不告诉代码使用什么类型(每次访问属性时)。您可以编写一个(例如)python 脚本,该脚本基于前两行为该类创建 *.cs 文件,然后将其编译到项目中。

关于不使用任何包...好吧,您可以编写一些简单的代码,在其中拆分行。如果可以保证,所有字段都不包含逗号(或分隔符)和换行符,它可以工作 - 但您仍然必须编写一个动态程序,将 csv 记录与属性相匹配,并以某种方式找到合适的反序列化器那种。我强烈建议为此使用库,例如​​ CsvHelper

作为旁注,如果您愿意考虑替代方案,我会将这个东西加载到键值数据库中(您可以使用 RDBMS 模拟它,尽管它不会超快)。使用 SQL 可能更容易。

TL;博士

  • 选项 1:使用脚本生成一个类,然后使用 nuget 包来处理序列化(“喷雾和祈祷”方法的种类)- linq 将像平常一样可用
  • 选项 2:使用更适合大型数据集的数据库

推荐阅读