如何从读取CSV后的List<string>中提取指定位置的字段值?
解决从CSV行字符串中提取指定字段的问题
嘿,我来帮你搞定这个问题!你现在把CSV的每一行都存在List<string>里了,但直接用Split(',')拆分可能踩坑——毕竟你的字段都是用双引号包起来的,万一某个字段里藏了逗号(哪怕你说格式固定,专业处理还是得防一手),直接拆分就会出错。不过咱们从你的需求出发,给你两种解决方案:
方法一:针对固定格式的手动处理
如果你的CSV格式完全没变化,每个字段都用双引号裹着,而且字段内部绝对不会有逗号,那可以这么处理每行:
拿你的表头行举例子:
string headerLine = searchList[0]; // 取出表头那一行 // 先把首尾的双引号去掉,再按"",""这个分隔符拆分 string[] fields = headerLine.Trim('"').Split(new string[] { "\",\"" }, StringSplitOptions.None); // 第4个值的索引是3(数组从0开始数哦) string valueDateHeader = fields[3]; Console.WriteLine(valueDateHeader); // 这里就会输出 Value Date
处理数据行的逻辑也是一样的,跳过表头就行:
foreach (string line in searchList.Skip(1)) // 跳过第一行表头 { string[] dataFields = line.Trim('"').Split(new string[] { "\",\"" }, StringSplitOptions.None); string valueDate = dataFields[3]; // 拿到每行的Value Date值 // 接下来就可以把这个值用到你要生成的新CSV里啦 }
方法二:更健壮的专业CSV解析(强烈推荐)
虽然你说读写CSV本身没问题,但手动拆分毕竟不够稳,万一以后格式有小变动,或者某个字段里突然出现逗号,代码直接就崩了。其实.NET里有原生的工具可以用——TextFieldParser(在Microsoft.VisualBasic.FileIO命名空间下,需要给项目加个引用就行),或者你也可以用第三方库CsvHelper,不过原生的就足够好用了。
给你写个TextFieldParser的示例代码:
// 先加引用:右键你的项目 -> 添加 -> 引用 -> 找到Microsoft.VisualBasic勾选上 using Microsoft.VisualBasic.FileIO; openFileDialog1.ShowDialog(); List<string[]> csvData = new List<string[]>(); using (TextFieldParser parser = new TextFieldParser(openFileDialog1.FileName)) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true; // 这个很关键!告诉解析器要识别双引号包裹的字段 while (!parser.EndOfData) { string[] fields = parser.ReadFields(); // 直接把一行拆成干净的字段数组 csvData.Add(fields); } } // 现在csvData里每个元素都是一行的字段数组,直接取索引3就好 string valueDateHeader = csvData[0][3]; foreach (string[] row in csvData.Skip(1)) { string valueDate = row[3]; // 该干嘛干嘛,处理逻辑随便写 }
这种方法不管字段里有没有逗号,都能正确解析,比手动拆分靠谱太多,以后维护也省心。
最后说一句
要是你就想坚持用原来的List<string>处理,方法一完全能满足你的固定格式需求,但真心推荐方法二,毕竟它能应对各种标准CSV的情况,避免莫名其妙的bug。
内容的提问来源于stack exchange,提问作者user3430861
相关产品推荐
相关产品推荐

