c# - C# 使用 CSV 标头为不同的变量赋值
问题描述
我正在阅读一个 CSV 文件,并且基本上是在尝试使用标题来确定文件中值的序数位置,尽管最后一部分给我带来了一些麻烦。以下是我到目前为止所拥有的:
private static IEnumerable<Cow> ReadCowStream(Stream source)
{
bool isHeader = true;
var cows = new List<Cow>();
using (var reader = new StreamReader(source))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
if (line != null)
{
var values = line.Split(',');
if (isHeader && values.Contains("Weight") && values.Contains("Age"))
{
isHeader = false;
}
else
{
cows.Add(new Cow(
weight: values[0],
age: values[1]));
}
}
}
}
return animals;
}
示例 CSV:
Weight,Age
300,10
319,11
100,1
370,9
在这种情况下,输出将是List<Cow>
第一个条目的值“Weight”:“300”和“Age”:“10”,但如果“Weight”和“Age”颠倒了怎么办?然后我将错误的值分配给错误的变量。
基本上,我想使用标题来确定是否放入values[0]
等weight
,age
因为我认为我不能保证在我正在阅读的 CSV 中哪个排在第一位。
解决方案
使用像 CsvHelper这样的库,可以根据标头名称而不是索引来提取值。
private static IEnumerable<Cow> ReadCowStream(Stream source) {
var cows = new List<Cow>();
using (var reader = new StreamReader(source)) {
var csv = new CsvReader(reader);
csv.Read();
csv.ReadHeader();
while (csv.Read()) {
cows.Add(new Cow(weight: csv["Weight"], age: csv["Age"]));
}
}
return cows;
}
因此,现在读取的 CSV 中哪个标题首先出现并不重要。
该库允许进行强类型解析。
如果Cow
使用默认构造函数定义并具有适当类型的属性
public class Cow {
public int Age { get; set; }
public int Weight { get; set; }
}
ReadCowStream
可以简化为
private static IEnumerable<Cow> ReadCowStream(Stream source) {
using (var reader = new StreamReader(source)) {
var csv = new CsvReader(reader);
return csv.GetRecords<Cow>().ToList();
}
}
CSV 阅读器将解析行、创建实例并通过将标题与属性名称匹配来分配值。
推荐阅读
- python - 如何将测试设置为在一个选项卡中一一运行?硒蟒
- ruby - 如何在 Squib 文本中正确嵌入半透明图像
- github - GithHub:限制可以推送到公共存储库的用户
- sql - 在为多个值搜索多个列时减少嵌套循环
- java - 在 Java 中用 Chronicle-Map 替换 Roaring64NavigableMap 的正确方法是什么?
- javascript - 如何修复 .remove() 在 javascript 中不起作用
- python-3.x - 制作项目以接收和输入数据
- html - 如何用 kable/kableextra html 表中的乘法符号替换 A*B 中的 *
- ios - 验证码只检查第一项?
- vbscript - 在 ActiveDirectory 中取消选中 *Require user's permission* 复选框