c# - 使用 C# 将未知大小的 CSV 转换为自定义对象

标签 c# csv

我正在尝试从我的客户自定义软件中导入一个文件。该文件基本上是一个 csv 文件,其中包含一些自定义转义字符。我正在逐行读取文件,然后将每一行拆分为一个字符串 []。然后我将每个元素分配给自定义对象中的一个字段。例如:

Person.Name = line[0];
Person.Age = line[1];
Person.Height = line[2];

等问题是,我导入的一些文件来自旧版本的应用程序,不包含所有字段。所以这一行

Person.Height = line[2];

出错是因为 line.Length = 2 而不是 3。

是否有解决此问题的“干净”方法?我现在通过在每次赋值之前写一个 if 语句来确保行 [x] 有效来解决这个问题,但这对我来说似乎很笨拙。

最佳答案

我有几个建议,假设您没有解析每一滴性能都很重要的巨大 CSV。

我使用的一种方法是在您实际开始处理数据之前执行一个步骤,确保文件格式一致。在您的情况下,这意味着扫描每一行以确定是否所有列都存在,如果不存在,则为缺失数据插入默认值。

这有助于将“清理”代码与数据处理分开。这实际上需要更多的编码,并且从性能的角度来看会更慢(因为您实际上是在解析文件两次),但可以帮助您的代码更容易阅读和调试,因为您将它分成两个单独的事件。

另一种方法是使用第三方库,如 LINQtoCSV负责为您标记“可为空”的列。然后,您可以将列作为命名属性而不是索引来引用。

关于c# - 使用 C# 将未知大小的 CSV 转换为自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1685118/

相关文章:

c# - 通过c#线程上传大文件

c# - 如果单元格的内容大于其宽度,如何在 DataGrid 中显示省略号?

MySQL CSV 导入 : datetime value

php - 使用 PHP 代码将 mysql 表导出为 CSV

iphone - 将 CSV 加载到 Core Data 托管的 sqlite 数据库中

c# - "yield return"概念的名称是什么? IEnumerable、迭代器、生成器?

c# - DataGrid -- AlternatingRowBackground 颜色干扰 "IsMouseOver"颜色

C#程序,有没有tostring()哪个好

MySQL : error with --secure- file-priv while using USE LOAD DATA INFILE from R

java.io.FileNotFoundException,系统找不到指定的路径(cvs文件)java