有人可以告诉我该怎么做。
有这样一个csv
;;temperature ID1;water ID1
;;C;moh
2022.05.22;07:00;8,5;499,24
2022.05.22;08:00;10,3;499,24
从给定的文件中可以看出,开头有两个标题行,甚至是空值。
在输出端,我想要这样一组值
public class Records
{
public DateOnly Dates { get; set; }
public string Times { get; set; }
public float Moh { get; set; }
public float Temperature { get; set; }
}
我试图通过手动处理来解决它,它自然有效。我唯一担心的是我必须用 分隔\r\n,因为不能保证文件中存在这个分隔符。这个
List<Records> records = new List<Records>();
using (var reader = new StreamReader("csvs\\test.csv"))
{
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split("\r\n");
foreach (var item in values)
{
var values_sep = item.Split(";");
try
{
var record = new Records{
Dates = DateOnly.Parse(values_sep[0]),
Times = values_sep[1],
Moh = float.Parse(values_sep[2]),
Temperature = float.Parse(values_sep[3])
};
records.Add(record);
}
catch (System.Exception)
{
System.Console.WriteLine("error");
}
}
}
}
接下来,我尝试了 CsvHelper,但配置设置令人困惑,我设法仅通过switch/case. 我将存根放在表单中System.Console.WriteLine,以免弄乱代码。
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
Delimiter=";"
};
using (var reader = new StreamReader("csvs\\test.csv"))
using (var csv = new CsvReader(reader, config))
{
while (csv.Read())
{
switch (csv.GetField(0))
{
case "":
System.Console.WriteLine("Headers Here");
break;
default:
System.Console.WriteLine("Record here");
break;
}
}
}
实际上问题是,是否可以在没有拐杖和硬编码的情况下阅读这样的计划 csv 文件?或者我的解决方案在 C# 领域是否完全可以接受?
我不明白你为什么用
\r\n. 毕竟,ReadLine类方法StreamReader已经为您提供了一个没有这些字符的完整字符串。如果您需要跳过两个标题行,最简单的方法是使用 linq 方法
Skip:如果不能保证文件中存在标头,则使用以下内容进行过滤
Where:最终代码可能如下所示:
或者全部在 LINQ 中:
然后我们将行列表解析到 Records 对象中(顺便说一下,记录更好,而不是记录 C)
根据需要,我们比较第一行中的标题,即 在
里面有细胞,然后解析。
没什么太复杂的
https://github.com/ukushu/DataExporter