- PR -

【C#】単一テキストファイルから重複行削除

投稿者投稿内容
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-06-15 16:50
仮想テーブルを使わないほうの話ですが、
NGリストの処理は、Hashtableをうまく使えば
キーの一覧なんて要らないと思いますよ?

ソースコードを直接載っけるのはあまり好きじゃないんですが、
日本語で説明するとかえってめんどくさいので…
コード:

try
{
StreamReader sr = null;
string s;
Hashtable ngHash = new Hashtable();
//NGデータのHashtable作成
try
{
sr = new StreamReader(@"C:\temp\ngdata.txt", Encoding.GetEncoding(932));
while ((s = sr.ReadLine()) != null)
{
ngHash[s] = true;
}
}
finally
{
if (sr != null) sr.Close();
}
//出力データを作成
sr = null;
ArrayList al = new ArrayList();
try
{
sr = new StreamReader(@"C:\temp\data.txt", Encoding.GetEncoding(932));
Hashtable uniqHash = new Hashtable();
while ((s = sr.ReadLine()) != null)
{
if (uniqHash[s] == null)
{
uniqHash[s] = true;
if (ngHash[s] == null)
{
al.Add(s);
}
}
}
}
finally
{
if (sr != null) sr.Close();
}
//ソート
al.Sort();
//出力
StreamWriter sw = null;
try
{
sw = new StreamWriter(@"C:\temp\output.txt", false, Encoding.GetEncoding(932));
for (int i = 0; i < al.Count; i++)
{
sw.WriteLine(al[i]);
}
}
finally
{
if (sw != null) sw.Close();
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}


#自分とこVS2003なので、StreamReaderとStreamWriterのDisposeは呼べませんでした(^^;

#プレビューしたら\が二重になっちゃったので修正(直してくれないかなこれ…)

[ メッセージ編集済み 編集者: ぼのぼの 編集日時 2006-06-15 17:05 ]
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-06-15 18:16
なんでこんなに長引いているのか理解に苦しむね。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-06-15 19:32
個人的にはこの処理が実は1回こっきりの処理でした!とかじゃないことを祈るばかりで
す。文面を読む限りは大丈夫な気がしますが、念為。

まぁ後半は技術公開の場になってるみたいなので、それはそれで有意義な話になってる
んじゃないでしょうか。

自分だったら Hashtable (相当)を使ってなんとかしようとしたでしょうけど、夏椰さんの
OLEDB を使って SELECT DISTINCT 方式はなるほどと考えさせられました
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-06-15 20:15
あーごめん。回答者さまに言ったわけじゃないっす。
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2006-06-16 10:27
夏椰様
ありがとうございます。試してみます!
ぼのぼの様
SortedListを使わなくてもHushtable+ArrayListのソートでやりたい事が
できるのですね。試してみます!!
ぽぴ王子様
一回こっきりの処理ではないですw
いろいろと使用しようと思っている処理なので、良い案があったら
ご教授いただけないかと思い、こちらに投稿させていただきました。
実際、夏椰様のOLEを使用してのやり方はこういう使い方ができるなんて
知らなかったので、大変勉強になりました。
ぶさいくろう様
そうですね…。このレスを最後にしたいと思います。
あまり長々とするのはよろしくないようなので…。

皆様いろいろとご教授下さって有難うございました!!
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-16 12:03
引用:

ぽぴ王子さんの書き込み (2006-06-15 19:32) より:

まぁ後半は技術公開の場になってるみたいなので、それはそれで有意義な話になってる
んじゃないでしょうか。


技術公開の場というよりは、サンプルコードが載っている便利な場所です。
僕も使う機会があったらコピペして使うことにしますw(駄目すか?^^;)

引用:

ぽぴ王子さんの書き込み (2006-06-15 19:32) より:

自分だったら Hashtable (相当)を使ってなんとかしようとしたでしょうけど、夏椰さんの
OLEDB を使って SELECT DISTINCT 方式はなるほどと考えさせられました


同感ですね。
できることは知っていたのですが、使うという発想が沸きませんでした。
こういう柔軟な発想ができることは、とても大切だなと改めて感じました。

引用:

ちづるさんの書き込み (2006-06-16 10:27) より:

ぶさいくろう様
そうですね…。このレスを最後にしたいと思います。
あまり長々とするのはよろしくないようなので…。


ぶさいくろうさんは、長々とするのが悪いと言っている訳じゃなくて、どうして長くなってしまったのだろうね?、と言っているのです。
これは一見似ていますが、大きな違いがあるのだと思いますた。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-06-16 12:07
引用:

ちづるさんの書き込み (2006-06-16 10:27) より:
そうですね…。このレスを最後にしたいと思います。
あまり長々とするのはよろしくないようなので…。


有意義である限りは、長くなっても構わないと思います。
ちづるさんの「こっちの方法の方が速かった」という結果報告は、大変参考になってますので。

あと、Hushtableではなく、Hashtableです。大分意味が違いますので。
hash
hush
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-06-17 06:24
 たぶん、ハッシュ テーブルのキーとして、読み込んだ文字列をそのまま保管する必要はない。
 HashTable.Item(object key) なんだから、key は文字列でなくてもいい。また、重複を避けるために使うんだから、文字列がそのまま保管されている必要もない。

 ということで、ハッシュのキーに使うのは、string.GetHashCode() でどうでしょう?

 また、NG ワードを別のハッシュにする必要もないような?先に登録してしまえば、重複扱いになりますよね?

スキルアップ/キャリアアップ(JOB@IT)