2

テキストファイルを開き、行がアルファベット以外の文字で始まる場合、または行自体が空白 (\n) でない限り、行末から \n を削除する非常に単純な ruby​​ スクリプトを作成しようとしています。

以下のコードは、最後の \n 行を超えるすべてのコンテンツをスキップすることを除いて、正常に動作します。ファイルの最後に \n\n を追加すると、完全に機能します。例: このテキストを含むファイルはうまく機能し、すべてを 1 行にまとめます。

Hello
there my
friend how are you?

になるHello there my friend how are you?

しかし、次のようなテキスト:

Hello

there

my friend
how
are you today

Helloと だけを返しThere、最後の 3 行を完全にスキップします。最後に 2 つの空白行を追加すると、すべてが取得され、希望どおりに動作します。

なぜこれが起こるのか、誰かが私に説明できますか? 明らかに、最初にソース ファイルの末尾に追加することでこのインスタンスを修正できることはわかってい\n\nますが、期待どおりに動作しない理由を理解するのに役立ちません.gets

助けてくれてありがとう!

source_file_name = "somefile.txt"
destination_file_name = "some_other_file.txt"
source_file = File.new(source_file_name, "r")

para = []
x = ""
while (line = source_file.gets)
  if line != "\n"
    if line[0].match(/[A-z]/)   #If the first character is a letter
        x += line.chomp + " "
    else
      x += "\n" + line.chomp + " "
    end
  else
    para[para.length] = x
    x = ""
  end
end

source_file.close

fixed_file = File.open(destination_file_name, "w")
para.each do |paragraph|
  fixed_file << "#{paragraph}\n\n"
end
fixed_file.close
4

3 に答える 3

2

問題は、空の行 ('\n') に遭遇した場合にのみ、文字列 x を para 配列に追加するという事実にあります。2番目の例には最後に空の行が含まれていないため、 x の最終的な内容が para 配列に追加されることはありません。

コードを変更せずにこれを修正する簡単な方法は、while ループを閉じた後に次の行を追加することです。

if(x != "")
    para.push(x)
end

空の行に到達するまで文字列を x に追加するのではなく、すぐに配列に追加することをお勧めしますが、これはソリューションで機能するはずです。

また、

para.push(x)
para << x

どちらもはるかに読みやすく、より簡単に見えます

para[para.length] = x

非動的言語ではエラーが発生するため、これには一瞬がっかりしました。読みやすいという理由だけで、代わりにそれらのいずれかを使用することをお勧めします。

于 2012-05-24T05:47:55.037 に答える
1

あなたのコードは私にとってACコードのようなものです。ルビーのやり方はこれで、100行以上を置き換えます。

File.write "dest.txt", File.read("src.txt")
于 2012-05-24T05:52:39.367 に答える
1

複数行の正規表現を使用する方が簡単です。多分:

source_file.read.gsub(/(?<!\n)\n([a-z])/im, ' \\1')
于 2012-05-24T05:55:10.347 に答える