C#读取CSV文件指定列并取最大值,解决字段含逗号取值错误问题
直接按逗号拆分CSV行无法处理被双引号包裹的含逗号字段,不要自行实现拆分逻辑,使用成熟的CSV解析方案即可解决问题。
方案1:使用.NET内置的TextFieldParser(无需第三方依赖)
该类出自Microsoft.VisualBasic程序集,C#可直接调用,原生支持符合RFC4180标准的CSV格式解析:
首先需要先添加对应引用:
- .NET Framework项目:直接在项目引用管理器中添加
Microsoft.VisualBasic程序集 - .NET Core/.NET 5+项目:安装NuGet包
Microsoft.VisualBasic.Core
改造后的代码如下:
using Microsoft.VisualBasic.FileIO; using System.IO; using System.Linq; // 若你直接读取CSV源文件,可将new StringReader(...)替换为文件路径字符串,效率更高 List<int> results = new List<int>(); using (TextFieldParser parser = new TextFieldParser(new StringReader(string.Join(Environment.NewLine, strs)))) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true; // 核心配置:自动识别引号包裹的字段,跳过字段内部的逗号 while (!parser.EndOfData) { string[] fields = parser.ReadFields(); // 新增校验避免索引越界、格式转换失败报错 if (fields.Length > 12 && int.TryParse(fields[12], out int columnVal)) { results.Add(columnVal); } } } int max = results.DefaultIfEmpty(0).Max();
方案2:正则拆分(仅适用于格式简单的CSV)
如果不想引入额外依赖,且确认你的CSV没有嵌套引号、字段内换行等复杂场景,可以用正则匹配仅拆分不在双引号内的逗号:
using System.Text.RegularExpressions; using System.Linq; var columnQuery = from line in strs let elements = Regex.Split(line, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)") .Select(field => field.Trim('"')) where elements.Length > 12 && int.TryParse(elements[12], out _) select Convert.ToInt32(elements[12]); int max = columnQuery.DefaultIfEmpty(0).Max();
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

