2010-11-26 1 views
0

私はcsvファイルに文字列(都市)の列を持っています。私はリストを通過し、すべての一致するパターンを反復し、最初のものだけを保持し、同様のものをすべて空白のラインに置き換える必要があります。 私はプログラマーではありませんが、もし私がこれを行うことができれば、私は多くの仕事に役立ちます! 私はRubyの概念と正規表現の考え方をEmacsで持っています。 これは実現可能ですか?誰も助けることができますか?Ruby、文字列を繰り返し、正確なパターンと一致し、最初のもの以外のものを置き換えます。

ありがとうございます!

ファイルは、こののようになります。

ボルドー

ボルドー

パリ

パリ

パリ

リオン

ファイルは次のようになります。

ボルドー

(空白)

パリ

(空白)

(空白)

リオン

+0

名前は常にグループ化されますか、混在している可能性がありますか? –

+0

また、CSVファイルから複数の列でこれを行う必要があるとしますか?複数の列を扱う場合、より完全な入力例を表示できますか? –

答えて

2

空行の維持:このような単純なタスクの場合

file_in = File.open('test_villes_ruby.txt','r') 
file_out = File.open('test_villes_ruby_stripped.txt','w') 

memo = "" 
file_in.each do |city| 
    if city == memo then 
    file_out << "\n" 
    else 
    file_out << city 
    memo = city 
    end 
end 

file_in.close 
file_out.close 
+0

ありがとうございます。実際には、それは他のすべての行を保持します... – Zazaza

+0

ああ私...出力ファイルを追加、書き直します。 – steenslag

+0

ありがとうございました。私は私のファイルをjiffyで調べることに興奮していました...(1,500行、ファイルごとに約10列)。もはや孤独な奴隷のように感じることはありません! – Zazaza

1

を、あなたも-eコマンドラインパラメータを使用してインタプリタに直接あなたのRubyスクリプトを渡すことができます。それを-nまたは-pと組み合わせると、あなたのルビースクリプトは入力のすべての行で順番に実行されます。変数$_は、現在処理中の行の内容を保持します。

だから、あなたの入力ファイルは次のように見える場合:

jablan-mbp:dev $ ruby -n -e 'puts(@memo == $_ ? "" : @memo = $_)' < test1.txt 
foo 


bar 

foo 
bar 



foo 
0

ソリューション:

File.open('cities', 'r') do |f_in| 
    File.open('cities_uniq', 'w') do |f_out| 
    f_in.inject("") { |o, c| f_out.puts o == c ? "\n" : c ; c} 
    end 
end 

入力:

jablan-mbp:dev $ cat test1.txt 
foo 
foo 
foo 
bar 
bar 
foo 
bar 
bar 
bar 
bar 
foo 

あなたは簡単なスクリプトをこのように実行することができます

Bordeaux 
Bordeaux 
Paris 
Paris 
Paris 
Riom 
Riom 
Riom 
Frankfurt 
Wien 
Wien 

出力:

Bordeaux 

Paris 


Riom 


Frankfurt 
Wien 

注:あり、最終的な「ウィーン」の後に空行がありますが、私はそれがここに表示することができません...

0

は、おそらく最も単純な方法は、ちょうどセット(またはにSortedSet場合は順序が重要)余分

cities = Set.new 

cities_in_csv.each do |city| 
    cities.add(city) 
end 

ナッシングを使用することです。定義によるセットには、重複する要素は含まれていません。

+0

OPは、改行で置き換えられる重複要素を要求しました。 –

+0

ありがとうございました。私はその部分を逃した。私は夜遅くに質問に答えるために得たものです。 – Olives

関連する問題