c# - 从 C# 中的特定标题名称读取 csv 文件
问题描述
我想读取一个 csv 文件,其中标题行从特定列名开始,即“名称”</p>
CSV 文件格式如下所示:
v3,vf,gf--Not a Header row 1
v1,c,z1,e--Not a Hera row 2
name,q1,q2,q3- Header Row- row 3-because name is here
a,0,1,2-Data
我想阅读“名称”列存在的位置 - 所以我想跳过前 2 行,但在“名称”之前我们不知道会出现多少行,它可能是 2 或 3 或 n
解决方案
逐行阅读,然后扔掉这些行,直到到达所需的标题行。然后,解析剩余的行。
IEnumerable<string[]> ReadDataLines(string csv) {
using(var reader = new StringReader(csv))
using(var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader)) {
parser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
parser.SetDelimiters(",");
// Until we find the header row, just throw away all the rows
while(!parser.EndOfData) {
var line = parser.ReadLine();
if(line != null && line.TrimStart().StartsWith("name")) {
break;
}
}
// The rest of the input is data rows
while(!parser.EndOfData) {
yield return parser.ReadFields();
}
}
}
在这里,我使用 Microsoft.VisualBasic.FileIO.TextFieldParser 来解析 CSV(请参阅Reading CSV files using C#)。您当然可以使用任何您想要解析 CSV 的技术,可以使用相同的通用方法。
推荐阅读
- angular - 使用 OAuth 和 IdentityServer4 在没有用户凭据的情况下验证 Angular 应用程序
- java - 如何在领域中将日期转换为字符串
- python - 在 Python 中打印浮点值(Mapbox 地理坐标)
- c# - XXX 类型不可分配给服务 YYY
- c++ - 动态内存分配和堆损坏
- c++ - 如何将此 SIGNAL 和 SLOT 转换为 qt5 连接调用?
- c++ - 为什么这个程序输出相同的结果 4 次?
- c# - C# 队列 - 我需要并发吗
- mysql - 固定帖子建模:在“帖子”表中具有固定标志列 VS 具有 pinned_posts 表
- opencv - LSDDetector 和一些相关功能在 Opencv 4.1.0 中无法工作