2

重複したエントリを含むファイルがあります。のように見えます

Los Angeles, 6
Los Angeles, 6 
New York, 31
New York, 31
New YOrk, 31
.
.
.

次に、重複データを取り除きたいと思います。私がやろうとしているのは、 each_line を使用して、行が次の行と等しいかどうかを確認し、同じ場合はスキップして、新しいファイルに書き込むことです。問題は、そのファイルの次の行を取得するにはどうすればよいですか? またはこれを行うための他の提案はありますか?

4

5 に答える 5

5

現在の行が前の行と一致するかどうかを簡単に確認できるため、次の行と比較する必要はありません。

file = File.open("filename", "r")
previous_line = nil
file.each_line { |line|
   if line == previous_line
     # duplicate line; ignore
   else
     # different; do whatever you want
   end

   # remember this line so we can compare against it
   previous_line = line
}
于 2012-09-21T21:57:55.290 に答える
3

重複が常に連続している場合、willglynn のソリューションが機能します。それ以外の場合は、それらをハッシュに入れるのが最善の方法だと思います。

unique_list = {}

File.foreach(filename) do |line|
  unique_list[line] = 1
end

unique_list.each do |line|
  new_file.print line
end
于 2012-09-21T23:45:55.410 に答える
2

繰り返される行が連続している場合は、次のように書くことができます。

lines = open("file.txt").each_line.chunk(&:downcase).lazy.map { |s, ss| ss.first }

downcase同等の文字列を決定する関数の代わりに使用します。

于 2012-09-21T22:04:35.783 に答える
1

Ruby ではなくシェルからこれを行うことができ、*nix で作業している場合は、より簡単になります。このために作成されたuniqと呼ばれる *nix ツールがあります。

ファイルinput.txtのサンプル入力を指定すると、次のようになります。

Los Angeles, 6
Los Angeles, 6
New York, 31
New York, 31
New YOrk, 31

次に、このコマンドは隣接する重複を削除し、結果を標準出力に出力します。

$ uniq input.txt
Los Angeles, 6
New York, 31
New YOrk, 31

「New York」の 3 番目のインスタンスのタイプミスにより、重複として認識されないことがわかります。

結果を別のファイルに送信するには:

$ uniq input.txt >output.txt
$ cat output.txt
Los Angeles, 6
New York, 31
New YOrk, 31

元のファイルを変更するために、uniq の出力をそのファイルにリダイレクトすることはできません。uniq が読み取っている入力を上書きすることになります。代わりに、一時ファイルを使用します。

$ uniq input.txt >input.txt.tmp && cp input.txt.tmp input.txt
$ cat input.txt
Los Angeles, 6
New York, 31
New YOrk, 31
于 2014-03-21T15:31:28.977 に答える
0

@Anthonyの答えに基づいています。私の考えは:

unique_list = {}
new_file=File.open('file2', "w")

File.foreach('filename') do |line|
  unique_list[line] = 1
end

unique_list.each do |key,value|
  new_file.puts key
end

各行は、値が 1 のハッシュのキーになります。キーは一意であるため、複製は単純に最後のものを上書きします。

入力文字列の末尾に余分なスペースがないことを確認した後の出力は..

Los Angeles, 6
New York, 31
New YOrk, 31
于 2016-08-28T01:50:04.557 に答える