2016-09-25 13 views
0

これは私のコードです:行の先頭にルビーの一致文字列またはスペース/タブおよびファイルにuniqの行を挿入

File.open(file_name) do |file| 
     file.each_line do |line|; 
     if line =~ (/SAPK/) || (line =~ /^\t/ and tabs == true) || (line =~ /^/and spaces == true) 
     file = File.open("./1.log", "a"); puts "found a line #{line}"; file.write("#{line}".lstrip!) 
     end 
     end 
    end 

File.open("./2.log", "a") { |file| file.puts File.readlines("./1.log").uniq } 
  1. 私は特定に一致するすべての行を挿入したいです文字列、タブで始めるか、スペースで始まるファイル1.log、すべての行にスペース/タブが付いているはずですので、最初に削除しました。

  2. 私は1.logでユニークな行を取得し、いくつかは、コードの上に行くと何かが正しくない場合は私に言うことができればそれは素晴らしいことだろう2.log

  3. にそれらを書きたいと思います。

  4. Rubyでファイルを使用する場合、w+aモードの違いは何ですか?

    w+ - Create an empty file for both reading and writing.

    a - Append to a file.The file is created if it does not exist.

    をしかし、両方のオプションは、ファイルに追加、私もw+ではなく>>の、>のように振る舞う必要がありますので、私は>>またw+を推測好き:

は、私が知っていますか?

ありがとうございます!

+0

メモとして、 'x == true'は必要ありません。 'x'が真であれば、' x'を単独で使うことができます。同様に '"#{x} "'は無駄です。 'line.lstrip! 'のように' x'を使うだけです。 – tadman

+0

'tabs'と' spaces'は、あなたが示したコードを実行する前に初期化されたローカル変数、またはメソッドです。正しい? –

+0

@CarySwovelandいいえ私はそれらを定義しませんでしたが、私はルビーがそれらを取る場所からわかりません – Berlin

答えて

1

このコードには多くの混乱があり、理由がなくても1行で物を詰まらせる習慣によって助けられません。機能は明白でなければならないので、コードをきれいにしてください。文字列を文字列にすることや、ブーリアンとブーリアンをテストすることのような奇妙な反パターンもたくさんあります。

中間ファイルが必要な状況では、Tempfileを使用します。

ここでクリーンアップだリワークバージョンです:

Tempfile.open do |temp| 
    File.open(file_name) do |input| 
    input.each_line do |line| 
     if line.match(/SAPK/) || (line.match(/^\t/) and tabs) || (line.match(/^ /) and spaces) 
     puts "found a line #{line}" 

     temp.write(line.lstrip!) 
     end 
    end 
    end 

    File.open("./2.log", "w+") do |file| 
    # Rewind the temporary file to read data back 
    temp.rewind 

    file.write(temp.readlines.uniq) 
    end 
end 

aw+は、大部分が類似しており、それはどんな表記に慣れて人々のために提供されているだけの二つの方法です。 Arrayと同じことをするlengthsizeの両方のようなものです。 1つを選択して一貫して使用すると、コードが混乱することがあります。

狭く、特定の何かが通常xは値の多数を取ることができることを意味し、trueは、我々が扱うようにしようとしている一つの特定のケースであるため、x == trueのようなものの上に私の批判は、我々はそれがかもしれない認識すべきであることを意味し、何かでありますfalseなど多くのものがあります。それはred herringで、質問のみを招待します。

+0

おかげさまで、数時間であなたの答えを確認できました – Berlin

+0

ちょっと@ tadman、私は

に 'block(2 levels)in 'を持っています:未定義のローカル変数またはメソッド' temp' for main:Object(NameError) 'on' temp.rewind'には、なぜでしょうか? – Berlin

+0

私はこのようなファイル名を得ます 'files = Dir ["/files_tmp/*。log "]; files.each do | file_name |;もしFile.directoryならばfile_nameを置きますか? file_name' – Berlin

関連する問題