- PR -

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

投稿者投稿内容
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2006-06-13 01:30
こんにちわ。

少し前からC#を開発しています。
(元々はVB6,ASP,VB.NETをやっていてC系は初めてです)

よくエクセルファイルである「重複行を削除」という
処理を行いたいのですが、検討もつきません。
想像ではStreamReaderを使用して、ファイルを読み出して
処理を行う、というのはわかってるのですが、
単一ファイル内の重複行を探し出して削除する、という処理が浮かびません・・・。

最初、ReadToEnd()で一気に読み出し、
新たにStreamReaderを作成して、ReadLine()で一行ずつ取り出して
マッチしたらremoveする、と考えていたのですが、
削除はできませんでした・・・。

どなたかご教授いただけると幸いです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-13 01:55
引用:

ちづるさんの書き込み (2006-06-13 01:30) より:

最初、ReadToEnd()で一気に読み出し、


ここは、まあ、良いのですが、

引用:

新たにStreamReaderを作成して、ReadLine()で一行ずつ取り出して


ReadToEnd メソッドで読んでいるのですから、そちらを使うべきですよね。

引用:

マッチしたらremoveする、と考えていたのですが、削除はできませんでした・・・。


どのようにして削除しようとしたのかわかりませんが、
Read したものをどうこうしても意味がありません。

編集したものを一気に Write すれば良いのではないでしょうか。
(Write より前の段階で躓いているように見えますが...)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-13 10:04
手順としては、

1.ファイルから読み込んで文字列配列に格納する。
2.文字列配列から重複している行を削除する。
3.文字列配列をファイルに書き込む。

になります。
じゃんねっとさんの仰っていますが、どの段階で躓いているのでしょうか?
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2006-06-13 10:12
>どの段階で躓いているのでしょうか?
このような感じで作ってみたのですが…
string sbTarget = new StringBuilder();
string text2;
sr = new StreamReader( filename, Encoding.GetEncoding(932));
sbTarget = ReadToEnd();
sr.Close();
sr = new StreamReader( filename, Encoding.GetEncoding(932));
while( ( text2 = sr.ReadLine() ) != null )
{

if(sbTarget.ToString()= text2.ToString)sbTarget.Remove();
sbTarget.Append(text2);
}
StreamReaderを二回読んでいたりとおかしいのは判っているのですが…。
Removeする引数の指定もどこで情報を取得するべきかすらわからない状態です。
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2006-06-13 10:13
追記です。
読み出すテキストファイルは10万行近くあります。
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2006-06-13 10:41
なんだかあせって意味不明なソースを書いてしまいました(汗


sr = new StreamReader( filename, Encoding.GetEncoding(932));
string text = sr.ReadToEnd();
sr.Close();
string text2;
string text3;
sr = new StreamReader( filename, Encoding.GetEncoding(932));
while( ( text2 = sr.ReadLine() ) != null )
{
以下の処理
txtの内容にtxt2の値が存在したら、削除しtext3に代入する。

}

if(text.ToString()= text2.ToString())ではそもそもの中身が違うので
=になるわけないですし、でも比較するにはうーん…と
悩んでます。
削除できても、こうなると重複で存在する行が全て削除されてしまうような気が
して・・・。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-13 10:41
引用:

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

読み出すテキストファイルは10万行近くあります。


ReadToEnd で一気に読み出している時点で全てメモリ上に格納していると思うのですが、レコード単位で処理したいのですか?
そうすると、ちょっとややこしくなりますが・・・
ちづる
ベテラン
会議室デビュー日: 2004/07/27
投稿数: 72
投稿日時: 2006-06-13 11:02
>ReadToEnd で一気に読み出している時点で全てメモリ上に格納していると思うのですが、レコード単位で処理したいのですか?
重複行の削除なので、レコード単位の処理と思ってます。
レコード単位以外の処理方法がありましたら教えていただけると
ありがたいです。

確かに10万行をレコード単位で処理するとプログラムが帰ってこなくなる
可能性が高いですよね・・・こういう大量データの場合はテキストで読み込みんじゃなくてバイナリで読み込んだりしたほうがよいのでしょうか?

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