| 列A|列B|列C|列D|
| --|--|--|--|
| ABC|--|BCD|--|
| EDF| SDG|--|rzh|
例如:在行1中,数据在B列和D列中不可用。因此,对于行1,标题输出应该是列A、列C。第2行相同,C列数据不可用。因此,对于第2行,标题输出应为列A、列B、列D。
string csvFilePath = "your_csv_file.csv";
using (var reader = new StreamReader(csvFilePath))
using (var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture)))
{
// Read the CSV records into a dynamic list
var records = csv.GetRecords<dynamic>().ToList();
// Get the headers from the first record
var headers = ((IDictionary<string, object>)records[0]).Keys.ToList();
// Create a list to store headers with data
var headersWithData = new List<string>();
// Iterate through headers and check if any row in the column has data
foreach (var header in headers)
{
if (records.Skip(1).Any(record => !string.IsNullOrWhiteSpace(record[header]?.ToString())))
{
headersWithData.Add(header);
}
}
// Print the filtered column headers with data
Console.WriteLine("Column Headers with Data:");
foreach (var header in headersWithData)
{
Console.WriteLine(header);
}
}
3条答案
按热度按时间exdqitrt1#
就像这样简单:
ParseCsvLine
将string
从CSV转换为stringp[]
。wmomyfyw2#
看起来你把
dynamic
数据类型当作IDictionary
数据类型。数据的类型转换将解决您的问题。ffx8fchx3#
你的想法是对的循环遍历记录,然后将
dynamic
记录转换为IDictionary<string, object>
。使用LINQ查找列值不是string.IsNullOrWhiteSpace
的项,然后选择Key
,即列标题。使用string.Join
连接返回的IEnumerable<string>
头名称,这些头名称包含该行的数据。