0

他のスタックオーバーフローでこれに対する答えが見つかりませんでした。ここで質問します。約 100000 行のテキスト ファイルがあります。このような複数のクエリを実行しています

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;
}

そして、これの複数のバージョンを実行しています。このようなものをより速く実行できるように、テキストファイルをロードする方法はありますか? より良い方法はありますか?現在、時間がかかりすぎています。

4

3 に答える 3

2

あなたは何をしようとしているのですか?

あなたのサンプルから、あなたがやろうとしているのは、ファイル内のレコード数を取得することだけのようです。

複数行にまたがるコンテンツがない場合は、代わりに行数 (ヘッダーの場合は -1 行) をカウントするだけでも安全かもしれません。

* 場合、および場合のみ

編集:

より複雑なことをしているので、行数を数えることはオプションではありません。

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

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

于 2012-04-19T14:04:05.030 に答える
0

ストリームを使用してファイルをメモリにロードします。こちらを参照してください。メモリに入ったら、クエリなどを実行します。

于 2012-04-19T13:36:33.780 に答える
-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();
于 2012-04-19T13:44:14.357 に答える