CSV文件逗号未替换,无法将字符串转为数字的问题求助
问题原因及解决方法
核心原因
1. 错误的CSV分割逻辑
直接用Split(',')拆分CSV行是问题根源:CSV规则中,双引号包裹的字段内部的逗号属于字段内容,不是分隔符。你的示例行a, 8, c, d, "(1,000)"用Split(',')拆分后,lineArr的元素会被截断为:
a8cd"(1`000)"
你操作的lineArr[4]只是被截断的部分,而非完整的最后一列,所以替换逗号、解析操作都会失败,输出时自然还能看到逗号。
2. 未处理字段的双引号
即使拿到完整的最后一列"(1,000)",Int32.Parse的NumberStyles.AllowThousands | NumberStyles.AllowParentheses不允许字符串包含双引号,这也是解析报错的直接原因。
解决方法
方法1:使用专业CSV解析器(推荐)
不要手动拆分CSV,用.NET自带的TextFieldParser或第三方库(如CsvHelper)正确解析带双引号的字段:
// 需要引用Microsoft.VisualBasic程序集 using Microsoft.VisualBasic.FileIO; using (var parser = new TextFieldParser("your-file.csv")) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); parser.HasFieldsEnclosedInQuotes = true; // 关键:识别双引号包裹的字段 while (!parser.EndOfData) { string[] fields = parser.ReadFields(); // 此时fields[4]为完整的"(1,000)" string rawValue = fields[4].Trim('"'); // 移除两端双引号 if (int.TryParse(rawValue, NumberStyles.AllowThousands | NumberStyles.AllowParentheses, null, out int num)) { int positiveNum = num * -1; fields[4] = positiveNum.ToString(); } // 生成处理后的CSV行 string outputLine = string.Join(",", fields); // 写入输出文件或控制台 } }
方法2:手动修复字段(临时应急)
如果不想引用额外程序集,可手动提取完整的最后一列(假设最后一列是唯一带双引号的字段):
string line = @"a, 8, c, d, ""(1,000)"""; // 定位双引号位置 int startQuote = line.IndexOf('"'); int endQuote = line.LastIndexOf('"'); string lastField = line.Substring(startQuote, endQuote - startQuote + 1); string cleanedValue = lastField.Trim('"'); // 移除双引号 if (int.TryParse(cleanedValue, NumberStyles.AllowThousands | NumberStyles.AllowParentheses, null, out int num)) { int positiveNum = num * -1; // 替换原行中的目标字段 string outputLine = line.Replace(lastField, positiveNum.ToString()); Console.WriteLine(outputLine); }
内容的提问来源于stack exchange,提问作者NootNoobJoe
相关产品推荐
相关产品推荐

