-4

問題は次のとおりです。拡張子が *.sld のファイルがあります。このファイルには、約 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);

しかし、データの列全体にアクセスする際に問題があり、2 倍の数値ではなく文字列配列です。このファイルの 1 つの列を double[] として ZedGraph に追加する必要があります。また、この dataTable を dataGridView に次のように割り当てようとしました。

dataGridView1.DataSource = fileData;
dataGridView1.Refresh();

しかし、列に double[] としてアクセスする方法 ??? 助言がありますか ?

4

2 に答える 2

1

しかし、列に double[] としてアクセスする方法 ??? 助言がありますか ?

File.ReadLinesファイル全体をメモリにロードしない whichを使用できます。

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();
于 2013-06-18T18:15:30.470 に答える
0

過去に StreamReader を使用してサンプル ファイルから約 30,000 行をインポートし、各行を 30 の異なるセルに解析し、それを使用してデータベースにインポートしました。読み取りと解析には数秒かかりました。あなたはそれを試してみることができます。「using」ステートメント内で必ず使用してください。

列 15 を解析する限り、関数を記述するよりも良い方法は考えられません。

于 2013-06-18T18:20:10.910 に答える