c# - 在 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软件包。但是,我有两个问题:
- 理想情况下,我想在不安装任何东西的情况下执行此操作(例如 Lumen CSV Reader 包)
- 我的 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 以最大速度查询最终数组)。
解决方案
有些包确实允许使用某种记录类型处理 csv 文件,然后您可以通过索引/标题名称读取(找不到我记得的那个)。但考虑到输入的大小,我不确定常规 csv 反序列化器的性能如何。
请考虑,如果没有基础类来表示记录,那么在某些时候您将不得不告诉代码使用什么类型(每次访问属性时)。您可以编写一个(例如)python 脚本,该脚本基于前两行为该类创建 *.cs 文件,然后将其编译到项目中。
关于不使用任何包...好吧,您可以编写一些简单的代码,在其中拆分行。如果可以保证,所有字段都不包含逗号(或分隔符)和换行符,它可以工作 - 但您仍然必须编写一个动态程序,将 csv 记录与属性相匹配,并以某种方式找到合适的反序列化器那种。我强烈建议为此使用库,例如 CsvHelper。
作为旁注,如果您愿意考虑替代方案,我会将这个东西加载到键值数据库中(您可以使用 RDBMS 模拟它,尽管它不会超快)。使用 SQL 可能更容易。
TL;博士
- 选项 1:使用脚本生成一个类,然后使用 nuget 包来处理序列化(“喷雾和祈祷”方法的种类)- linq 将像平常一样可用
- 选项 2:使用更适合大型数据集的数据库
推荐阅读
- deployment - 如何绘制部署图?
- php - 如何验证是否在jquery ajax .prop fumction()中选中了复选框?
- qt - 从一个线程写入套接字并从另一个线程读取
- java - NullPointerException,但仅当我将 Android 手机连接到计算机时
- c# - Jsreport Xlsx 列大小
- sql-server - SSIS - SSIS 挂起时的最佳实践
- php - 无法更新mysql中的列
- java - Retrofit2拦截器将特殊字符转换为Android中的问号
- python - Flask/Python - 如何以文本形式而不是列表呈现这些数据
- python - How to create Polygon out of {'northeast': {'lat':}, 'southwest': {'lat': }} (google maps) Python