考虑一个CSV文件,其中我知道前两列的样子,但不知道其余列的样子:
Id | DateWithTime | column 3 | ... | column n
我想读取这样一个文件,按DateWithTime
列排序并保存。我不知道这个文件有多少列,所以我无法为它建立模型。我只知道它至少有前两列Id
和DateWithTime
。那么,如何使用CSVHelper访问此文件并对其进行排序?
注意:假设DateWithTime
可以按字母顺序排序,这里没有什么特别之处。问题是如何访问它,因为由于列的数量未知,我无法构建模型。
注2:标头可能不完整,例如标头可能有5列,但数据有时可能有6列或更多列。
也许作为dynamic
对象进行读取是可行的?https://joshclose.github.io/CsvHelper/examples/reading/get-dynamic-records/
void Main()
{
using (var reader = new StreamReader("path\to\file.csv"))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
var records = csv.GetRecords<dynamic>();
var sorted = records.OrderBy(i => DateTime.Parse(i.DateWithTime)).ToList();
using (var writer = new StreamWriter("output.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(records);
}
}
}
尽管";可以是比标题"更多的行;这个问题可能不太适用。
另一种选择可能是将数据按行读取和排序,而不进行解析(尽管如果某些数据是多行数据,则会有问题(。
也许DataTable将是解决方案?您可以根据需要添加任意多的列,插入行,保持日期时间数据类型,其余列都是纯文本,这不是问题。DataTable可以对行进行排序。如果标头不完整,则可以在读取文件时添加列。或者添加比预期更多的列。列名无关紧要。
编辑时间:更好的选项可以使用类读取,如:
public class Row
{
public int Id {get;set;}
public DateTime DateWithTime {get;set;}
public string RestOf {get;set;}
}
你不在乎列的长度,使用Linq排序是的简单部分