2012-04-19 3 views
0

私はここでそれを求めるでしょう他のstackoverflowでこれに対する答えを見つけることができませんでした。私は約100000行のテキストファイルを持っています。私はこのような複数の質問をしていますクイックアクセスのためのテキストファイルをロードするC#windowsフォームアプリケーション

string header = isFirstRowHeader ? "Yes" : "No"; 
string pathOnly = Path.GetDirectoryName(path); 
string fileName = Path.GetFileName(path); 
string sql = @"SELECT Count(*) as NumberofRecords FROM [" + fileName + "]"; 

using (OleDbConnection connection = new OleDbConnection(
     @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
     ";Extended Properties=\"Text;HDR=" + header + "\"")) 
using (OleDbCommand command = new OleDbCommand(sql, connection)) 
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command)) 
{ 
    DataTable dt = new DataTable(); 
    dt.Locale = CultureInfo.CurrentCulture; 
    adapter.Fill(dt); 
    return dt; 
} 

そして、これは複数のバージョンを実行しています。テキストファイルを読み込む方法はありますか?私はこれをもっと速く動かすことができますか?より良い方法がありますか?現在は時間がかかりすぎています。

+0

この最適化を正当化するのに十分なクエリを実行していますか?もしそうなら、あなたは一度だけ全体のデータを「DataTable」またはメモリ内のデータベースに吸い込み、それに対してクエリを実行することができます。 – R0MANARMY

+0

それで、より複雑なサンプルを必要な時間とともに投稿できますか? – VVS

答えて

2

何をしようとするの?

サンプルからは、ファイル内のレコード数を取得するだけです。

複数の行にまたがるコンテンツがない場合は、行数(ヘッダの-1行)を数えても安全です。

*場合にのみ、

EDIT:あなたはもっと複雑なものをやっているので、

ので、行数を数えるには、オプションではありません。

私は、0.43秒で処理された100kレコード(7.7MBのサイズ)のサンプルファイルを生成しました。 count(*) .. group by Nameには0.58秒かかりました。

あなたの番号は何ですか、なぜそれが長すぎると思いますか?ファイルはどこにありますか?それはおそらくネットワーク/遅いドライブの問題ですか?

+0

姓と名の組み合わせを数えるのと同じように、もう少し複雑なものもありますが、最も単純なものを投稿しました。 – Badmiral

0

ストリームを使用してファイルをメモリにロードします(hereを参照)。それはメモリ内だ後は、などあなたのクエリを実行

+0

小さなファイルのための良いオプションが、私はそれがメモリにそのような巨大なファイル(100000行)をロードするための良いオプションではないと思う。 –

+2

各行はおそらく2ダースのバイト* 100000なので、あなたはメガバイトオーダーになります。あなたはおそらく数ギガバイトのメモリを持っているので、心配する必要は全くありません – ldgorman

+0

OleDbConnectionにあなたのメモリストリームをどのように利用させてもらいたいのですか? – VVS

-1

あなたは、次の例を使用することができます

string filename = @"C:\BigTextFile.txt"; 
StreamReader sr = System.IO.File.OpenText(filename); 

// Process line by line. 
string line = ""; 
do 
{ 
line = sr.ReadLine(); 
} 
while(sr.Peek() != -1); 

// Load all at once and process. 
string alltext = sr.ReadToEnd(); 

sr.Close(); 
+0

非常に多くのレベルで間違っているようです。 – VVS

+0

だから、あなたは長い文字列を持っています。次は何ですか? – Jodrell

+1

@Jodrell:最後の行しかありません。すべてのテキストは空白でなければなりません:) – VVS