访问超过1 000 000个数字的最佳方式C#

时间:2013-06-18 17:50:12

标签: c# datagridview datatable numbers zedgraph

所以问题是: 我有一个* .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 []的方式访问列? 有什么建议 ?

2 个答案:

答案 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列而言,我无法想到比编写函数更好的方法。