所以问题是: 我有一个* .sld extesnion的文件。 此文件包含大约94列和24500行数字,可以作为普通文本文件读取。 从程序中访问这些数字的最佳方法是什么?例如,我希望第15列中的所有数字都存储为double。我有什么选择? 我已经尝试过dataTable,但是使用File.ReadAllLines加载整个文件需要大约150MB的RAM内存来运行程序,我不得不考虑这个程序会使用多个这样的文件。 * .sld文件看起来像这样:
0.000 96.47 2.51 1.43 2.56 2.47 5.83 -> more columns
1.030 96.47 2.52 1.39 3.14 2.43 5.60 |
2.044 96.47 2.43 1.63 2.96 2.34 5.86 \/
3.058 96.47 2.47 0.76 2.59 2.44 5.62 more rows
4.072 96.47 2.56 1.39 2.99 2.38 5.89
除了之前提到的更多列和行。 我的解决方案是这样的:
//Read all lines of opened file to string array
string[] lines = System.IO.File.ReadAllLines(@OFD.FileName,Encoding.Default);
//Remove more than one whitespace with only one whitespace in cycle (cycle not shown)
string partialLine = Regex.Replace(lines[i], @"\s+", " ");
//Split string to string array and add it to dataTable
string[] partialLineElement = partialLine.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries);
fileData.Rows.Add(partialLineElement);
但我访问整列数据时遇到问题,它是一个字符串数组,而不是双数字。我需要它将此文件的一列添加到ZedGraph作为double []。我还尝试将此dataTable分配给dataGridView:
dataGridView1.DataSource = fileData;
dataGridView1.Refresh();
但如何以double []的方式访问列? 有什么建议 ?
答案 0 :(得分:1)
但是如何以double []的方式访问列?有什么建议吗?
您可以使用不会将整个文件加载到memmory中的File.ReadLines
。
ReadLines和ReadAllLines方法的不同之处如下:使用ReadLines时,可以在返回整个集合之前开始枚举字符串集合;当您使用ReadAllLines时,必须等待返回整个字符串数组才能访问该数组。因此,当您使用非常大的文件时,ReadLines可以更有效。
double[] col4 = File.ReadLines(filename)
.Select(line => line.Split(new char[]{' '},StringSplitOptions.RemoveEmptyEntries))
.Select(p => double.Parse(p[4],CultureInfo.InvariantCulture))
.ToArray();
获取所有列
double[][] allCols = File.ReadLines(filename)
.Select(line => line.Split(new char[]{' '},StringSplitOptions.RemoveEmptyEntries))
.Select(p => p.Select(s => double.Parse(s, CultureInfo.InvariantCulture)).ToArray())
.ToArray();
答案 1 :(得分:0)
我过去曾使用StreamReader从示例文件中导入大约30,000行,将每行解析为30个不同的单元格,并将其用于导入数据库。阅读和解析只需几秒钟。你可以试一试。只需确保在“使用”声明中使用它。
就解析第15列而言,我无法想到比编写函数更好的方法。