我正在使用<body>
中的CsvHelper
库来读取C#
文件,如下所示:
CSV
从代码中可以看到,我的问题是我不知道记录中有多少列。由于在解析数据之前我不知道数据的结构(我输入的CSV文件始终是不同的),我如何找出有多少列?我尝试查询var dataCsvFileReader = File.OpenText(inputFile);
var dataCsvReader = new CsvReader(dataCsvFileReader);
var dataRecords = dataCsvReader.GetRecords<dynamic>();
foreach(dynamic record in dataRecords){
for(int i = 0; i < ???; i++){ //How many columns are there in the record???
Console.WriteLine($"Record {i} value is: {record[i]}");
}
}
,但始终返回dataCsvReader.Context.ColumnCount
。
答案 0 :(得分:3)
您可以将每条记录转换为List
using (TextReader dataCsvFileReader = File.OpenText(inputFile))
{
using (CsvReader dataCsvReader = new CsvReader(dataCsvFileReader))
{
while (dataCsvReader.Read())
{
var dataRecord = Enumerable.ToList(dataCsvReader.GetRecord<dynamic>());
}
}
}
答案 1 :(得分:3)
在此列出解决方案,列出并显示动态CSV的值。
为了读取和查找列,您需要一些信息:分隔符,编码(如果文件具有标题)。没有这些,就无法实现这一目标。
在下面的示例中,我使用标头和编码的默认值。
这里的想法是处理将csv转换为List<Dictionary<string, object>>
。 using
没有处理来尽快释放StreamReader
。
List<IDictionary<string, object>> dataRecords ;
using (TextReader reader = new StreamReader(path))
using (var csvReader = new CsvReader(reader))
{
csvReader.Configuration.Delimiter = ";";
dataRecords = csvReader.GetRecords<dynamic>()
.Select(x => (IDictionary<string, object>)x)
.ToList();
}
foreach (var record in dataRecords)
{
// Print number of columns, and columns collection.
Console.WriteLine($"-> {record.Count} Columns {{{string.Join(", ", record.Keys)}}}");
foreach (var property in record.Keys)
{
Console.WriteLine(String.Format("\t{0} : {1}", property, record[property]));
}
}
为避免可能出现的性能瓶颈拳击,您可以使用字典:
.Select(x => new Dictionary<string, object>((IDictionary<string, object>)x))
结果:
-> 43 Columns {Method, Job, AnalyzeLaunchVariance,...}
Method : DiffOriginalNoAny
Job : Default
AnalyzeLaunchVariance : False
-> 43 Columns {Method, Job, AnalyzeLaunchVariance,...}
Method : DiffOriginal
Job : Default
AnalyzeLaunchVariance : False
答案 2 :(得分:1)
您应该记住要做的一件事,就是在访问csv之前先阅读它:
var dataCsvFileReader = File.OpenText(inputFile);
var dataCsvReader = new CsvReader(dataCsvFileReader);
dataCsvReader.Read();
var dataRecords = dataCsvReader.GetRecords<dynamic>();
我建议在这里使用using
子句:
var dataCsvFileReader = File.OpenText(inputFile);
using(CsvReader dataCsvReader = new CsvReader(dataCsvFileReader))
{
//read before accessing csv file
dataCsvReader.Read();
//count for columns
var count = dataCsvReader.Context.ColumnCount;
var dataRecords = dataCsvReader.GetRecords<dynamic>();
}
答案 3 :(得分:0)
您可以这样做:
using (var reader = new StreamReader(file))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
while (await csv.ReadAsync())
{
var count = csv.Context.Record.Length; // get the length of the record
}
}