如何将CSV文件内容存入double[]数组?解析时遇格式异常求解决
读取CSV转double数组触发FormatException异常的解决
问题现象
读取CSV文件内容到字符串数组正常,但转换为double数组时抛出异常:
System.FormatException: 'Input string was not in a correct format.'
原代码
string[] csvFile = System.IO.File.ReadAllText(@"C:\Users\...\Documents\CSVExample.csv").Split(','); double[] dblArray = Array.ConvertAll(csvFile, double.Parse); foreach (double d in dblArray) { System.Console.WriteLine(d); }
CSV文件内容
10,14,7,1,19,4,15,17,16,5,13,8,18,2,12,9,3,20,6,11 6,10,13,17,4,11,5,14,19,3,9,20,15,8,1,2,18,7,12,16 13,5,11,6,4,10,9,17,19,14,1,16,12,8,7,18,20,2,15,3 2,5,4,14,20,15,3,13,7,1,12,8,19,18,11,10,9,6,16,17
尝试过的其他写法(仍报错)
double[] dblArray = csvFile.Select(s => Convert.ToDouble(s)).ToArray();
问题原因
直接用Split(',')拆分整个文件内容时,文件中的换行符(\r/\n)会被包含在拆分后的字符串元素中(比如第一行末尾的11和第二行开头的6会被合并成"11\n6"这类无法解析为数字的字符串),导致double.Parse或Convert.ToDouble触发格式异常。
解决方法
方法1:按行拆分后再处理(推荐)
先按行读取文件,再逐行拆分逗号,避免跨行的无效字符串:
string[] lines = System.IO.File.ReadAllLines(@"C:\Users\...\Documents\CSVExample.csv"); List<double> dblList = new List<double>(); foreach (string line in lines) { foreach (string part in line.Split(',')) { if (double.TryParse(part, out double num)) { dblList.Add(num); } } } double[] dblArray = dblList.ToArray();
方法2:多分隔符拆分并过滤空元素
拆分时同时指定逗号和换行符作为分隔符,并移除空元素:
char[] separators = { ',', '\r', '\n' }; string[] csvParts = System.IO.File.ReadAllText(@"C:\Users\...\Documents\CSVExample.csv") .Split(separators, StringSplitOptions.RemoveEmptyEntries); double[] dblArray = Array.ConvertAll(csvParts, double.Parse);
方法3:健壮性处理(兼容无效值)
使用double.TryParse跳过无效值,并记录异常内容方便排查:
char[] separators = { ',', '\r', '\n' }; string[] csvParts = System.IO.File.ReadAllText(@"C:\Users\...\Documents\CSVExample.csv") .Split(separators, StringSplitOptions.RemoveEmptyEntries); List<double> validDoubles = new List<double>(); foreach (string part in csvParts) { if (double.TryParse(part, out double num)) { validDoubles.Add(num); } else { Console.WriteLine($"无法转换的内容: {part}"); } } double[] dblArray = validDoubles.ToArray();
内容的提问来源于stack exchange,提问作者l4dehh
相关产品推荐
相关产品推荐

