テキスト形式ファイルの重複行を削除し更にソート
何かしらの数値計算をやって、結果をファイルに書き込んだとき、精度の関係で結果のテキストが重複行だらけになってしまっていることが経験上多かったので、そういったファイルの重複行を削除してついでにソートしてしまうというスクリプトを書いてみた。
# -*- coding: Shift_JIS -*- print "入力ファイル名 : " readfile = gets.chomp print "出力ファイル名 : " writefile = gets.chomp if writefile.empty? then writefile = readfile end lines = Array.new begin File.open(readfile) { |file| while line = file.gets lines << line.chomp end } lines.uniq!.sort! File.open(writefile, "w") { |file| lines.each do |l| file.puts(l) end } rescue => ex puts ex.message else puts "処理を終了しました。" end
入力ファイル名と出力ファイル名をコンソールから入力する際、gets の返り値に対して chomp メソッドを使用しているが、これをしないとファイル名を正しく入力したつもりでも最後に改行記号が追加されてしまうので上手く行かない。後、入力ファイルの最後が改行で終わっていることを前提に作っているので、もしそうでないと、(file.gets のときに改行記号も一緒に読み込まれるので)実際は重複しているのに重複行とみなされないことがあるのでそこにも注意が必要である。…とまぁ、問題点はいくつかあったりするのだが、同じ動作をするプログラムを Java で書くよりかソースが格段に短くなったのでちょっと嬉しかった。
追記 : やっぱ件の問題点が気に食わんので修正した。
追記 2 : 出力ファイルの指定を省略した場合は元のファイルを破壊的に変更するように設定。
ちなみに Java で書いたのはこんなの。
import java.io.*; import java.util.*; class UniqueLineText { public static void main(String[] args) { Set<String> lines = new TreeSet<String>(); BufferedReader br = null; BufferedWriter bw = null; try { br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("入力ファイル : "); String readFile = br.readLine(); System.out.print("出力ファイル : "); String writeFile = br.readLine(); if(writeFile.isEmpty()) { writeFile = readFile } br = new BufferedReader(new FileReader(readFile)); String str; while((str = br.readLine()) != null) { lines.add(str); } bw = new BufferedWriter(new FileWriter(writeFile)); for(String s : lines) { bw.write(s + "\r\n"); } System.out.println("処理を終了しました。"); } catch(FileNotFoundException e) { System.out.println("ファイルが見つかりません。"); } catch(IOException ee) { } finally { try { if(br != null) br.close(); if(bw != null) bw.close(); } catch(IOException e) { } } } }
長ぇわw