C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: プログレスバーでの進捗について・・・・


(過去ログ 30 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■14468 / inTopicNo.1)  プログレスバーでの進捗について・・・・
  
□投稿者/ ぽん他 (10回)-(2008/02/19(Tue) 14:00:55)

分類:[.NET 全般] 

本日、とてもお世話になっております。

プログレスバーの勉強をしているのですが、
どうしていいものか判らなくて質問させて下さい。

CSVファイルを読み込んで、
データベースに1行ずつインサートをするんですが、
(すみません、考えてるだけでまだ出来ていません)
進捗率を以下のように考えています。
(??%完了ってよく見かける奴です)
iCount * 100 / iRowCount;

これって iRowCountを得るのに1行ごとに読み込んで
全行数を数えると、それに時間が掛かり、
実際に%表示でデータベースにインサートするまでに
プログレスバーが動かないんじゃないかなと思うのですが、

こう言った場合、どうするのでしょうか?

予定:
CSVFILE:20,000行
DB:SQLite

よろしくお願いします。
引用返信 編集キー/
■14470 / inTopicNo.2)  Re[1]: プログレスバーでの進捗について・・・・
□投稿者/ まどか (448回)-(2008/02/19(Tue) 14:42:02)
> CSVファイルを読み込んで、
> データベースに1行ずつインサートをするんですが、
> iCount * 100 / iRowCount;
>
> これって iRowCountを得るのに1行ごとに読み込んで
> 全行数を数えると、それに時間が掛かり、
> 実際に%表示でデータベースにインサートするまでに
> プログレスバーが動かないんじゃないかなと思うのですが、

1件のサイズが決まっていれば、FileInfoなどでファイルサイズを求めて割り算すれば件数がわかります。
それ以外は一気に読んでしまうことですが、
全体の件数を取得するのに時間がかかって本来の処理に影響があると本末転倒です。
仕様として「大きくても数メガのファイルが対象」など限定事項がある場合は一気に読んでしまうことはできます。
その後、読み込んだ配列やコレクションを基にループ処理をすればよいでしょう。

で、一気に読むことはできない場合の例です。
1.ファイルサイズを求めます。
2.1件処理するごとにデータの長さ(バイト)+2バイト(改行コード)を求めて足しこんでいきます。
  →足しこんだデータ長が処理済サイズになります。後は割り算。
※ファイルサイズはバイトですが、データの長さはほとんどの場合は文字数なので注意。
引用返信 編集キー/
■14476 / inTopicNo.3)  Re[2]: プログレスバーでの進捗について・・・・
□投稿者/ ぽん他 (12回)-(2008/02/19(Tue) 18:06:09)
まどかさん

お返事ありがとうございます。
以下のようにして、行数を得ることが出来ました。

string[] strAllFile = File.ReadAllLines(@"C:\xxx\yyy\zzz.csv", Encoding.UTF8);
int iRowCount = strAllFile.Length;

これには、サイズを限定する必要があるってことですよね????



No14470 (まどか さん) に返信
>>CSVファイルを読み込んで、
>>データベースに1行ずつインサートをするんですが、
>>iCount * 100 / iRowCount;
>>
>>これって iRowCountを得るのに1行ごとに読み込んで
>>全行数を数えると、それに時間が掛かり、
>>実際に%表示でデータベースにインサートするまでに
>>プログレスバーが動かないんじゃないかなと思うのですが、
>
> 1件のサイズが決まっていれば、FileInfoなどでファイルサイズを求めて割り算すれば件数がわかります。
> それ以外は一気に読んでしまうことですが、
> 全体の件数を取得するのに時間がかかって本来の処理に影響があると本末転倒です。
> 仕様として「大きくても数メガのファイルが対象」など限定事項がある場合は一気に読んでしまうことはできます。
> その後、読み込んだ配列やコレクションを基にループ処理をすればよいでしょう。
>
> で、一気に読むことはできない場合の例です。
> 1.ファイルサイズを求めます。
> 2.1件処理するごとにデータの長さ(バイト)+2バイト(改行コード)を求めて足しこんでいきます。
>   →足しこんだデータ長が処理済サイズになります。後は割り算。
> ※ファイルサイズはバイトですが、データの長さはほとんどの場合は文字数なので注意。
引用返信 編集キー/
■14480 / inTopicNo.4)  Re[3]: プログレスバーでの進捗について・・・・
□投稿者/ 魔界の仮面弁士 (640回)-(2008/02/19(Tue) 19:20:56)
No14476 (ぽん他 さん) に返信
> string[] strAllFile = File.ReadAllLines(@"C:\xxx\yyy\zzz.csv", Encoding.UTF8);
UTF-8 形式の CSV ファイルは珍しいと思うのですが、そのコーディングは正しいのでしょうか?
(もしかして、Encoding.GetEncoding("Shift_JIS") では無いのかな、と思ったので)

> int iRowCount = strAllFile.Length;
> これには、サイズを限定する必要があるってことですよね????
必要であるか、と問われると微妙なところです。
できれば、「サイズを限定した方が良い」とは思いますが、
「サイズを限定しなければいけない」というわけでは無いかと。


ただ、もしもサイズを限定するのであれば、超過していた場合の動作を
あらかじめ定めておかなければいけませんね。

案1) 超過時は「エラーとして処理を中止」
案2) 超過時は「進捗表示無しで取り込みを行う」
案3) 超過時は「別の方法で進捗判定を行う」
引用返信 編集キー/
■14481 / inTopicNo.5)  Re[4]: プログレスバーでの進捗について・・・・
□投稿者/ ぽん他 (14回)-(2008/02/19(Tue) 19:44:28)
魔界の仮面弁士 さん

お返事ありがとうございます。

> UTF-8 形式の CSV ファイルは珍しいと思うのですが、そのコーディングは正しいのでしょうか?
> (もしかして、Encoding.GetEncoding("Shift_JIS") では無いのかな、と思ったので)

すみません、今までWeb系処理ばかりやっていましたもので、
その時の癖で UTF-8 でやってました。

> ただ、もしもサイズを限定するのであれば、超過していた場合の動作を
> あらかじめ定めておかなければいけませんね。
>
> 案1) 超過時は「エラーとして処理を中止」
> 案2) 超過時は「進捗表示無しで取り込みを行う」
> 案3) 超過時は「別の方法で進捗判定を行う」

なるほどですね。納得です。

助かりました。ありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -