- - PR -
【C#】単一テキストファイルから重複行削除
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-13 01:30
こんにちわ。
少し前からC#を開発しています。 (元々はVB6,ASP,VB.NETをやっていてC系は初めてです) よくエクセルファイルである「重複行を削除」という 処理を行いたいのですが、検討もつきません。 想像ではStreamReaderを使用して、ファイルを読み出して 処理を行う、というのはわかってるのですが、 単一ファイル内の重複行を探し出して削除する、という処理が浮かびません・・・。 最初、ReadToEnd()で一気に読み出し、 新たにStreamReaderを作成して、ReadLine()で一行ずつ取り出して マッチしたらremoveする、と考えていたのですが、 削除はできませんでした・・・。 どなたかご教授いただけると幸いです。 | ||||||||||||
|
投稿日時: 2006-06-13 01:55
ここは、まあ、良いのですが、
ReadToEnd メソッドで読んでいるのですから、そちらを使うべきですよね。
どのようにして削除しようとしたのかわかりませんが、 Read したものをどうこうしても意味がありません。 編集したものを一気に Write すれば良いのではないでしょうか。 (Write より前の段階で躓いているように見えますが...) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-06-13 10:04
手順としては、
1.ファイルから読み込んで文字列配列に格納する。 2.文字列配列から重複している行を削除する。 3.文字列配列をファイルに書き込む。 になります。 じゃんねっとさんの仰っていますが、どの段階で躓いているのでしょうか? | ||||||||||||
|
投稿日時: 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する引数の指定もどこで情報を取得するべきかすらわからない状態です。 | ||||||||||||
|
投稿日時: 2006-06-13 10:13
追記です。
読み出すテキストファイルは10万行近くあります。 | ||||||||||||
|
投稿日時: 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())ではそもそもの中身が違うので =になるわけないですし、でも比較するにはうーん…と 悩んでます。 削除できても、こうなると重複で存在する行が全て削除されてしまうような気が して・・・。 | ||||||||||||
|
投稿日時: 2006-06-13 10:41
ReadToEnd で一気に読み出している時点で全てメモリ上に格納していると思うのですが、レコード単位で処理したいのですか? そうすると、ちょっとややこしくなりますが・・・ | ||||||||||||
|
投稿日時: 2006-06-13 11:02
>ReadToEnd で一気に読み出している時点で全てメモリ上に格納していると思うのですが、レコード単位で処理したいのですか?
重複行の削除なので、レコード単位の処理と思ってます。 レコード単位以外の処理方法がありましたら教えていただけると ありがたいです。 確かに10万行をレコード単位で処理するとプログラムが帰ってこなくなる 可能性が高いですよね・・・こういう大量データの場合はテキストで読み込みんじゃなくてバイナリで読み込んだりしたほうがよいのでしょうか? |