Ruby File не чете съдържание след последния празен ред \n

Опитвам се да напиша много прост ruby ​​скрипт, който отваря текстов файл, премахва \n от края на редовете, ОСВЕН АКО редът не започва с неазбучен знак ИЛИ самият ред е празен (\n).

Кодът по-долу работи добре, с изключение на това, че пропуска цялото съдържание след последния \n ред. Когато добавя \n\n в края на файла, той работи перфектно. Примери: Файл с този текст в него работи чудесно и изтегля всичко на един ред:

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

person ShawnyV    schedule 24.05.2012    source източник
comment
Празен ред не е \n. Освен това /[A-z]/ може да не прави това, което мислите, че прави.   -  person pguardiario    schedule 24.05.2012


Отговори (3)


Вашият проблем се крие във факта, че добавяте своя низ x към пара масива само ако и само ако срещнете празен ред ('\n'). Тъй като вашият втори пример не съдържа празния ред в края, крайното съдържание на x никога не се добавя към пара масива.

Лесният начин да поправите това, без да променяте кода си, е да добавите следните редове след затваряне на цикъла while:

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

Бих предпочел да добавя низовете към моя масив веднага, вместо да ги добавям към x, докато ударите празен ред, но това трябва да работи с вашето решение.

Също,

para.push(x)
para << x

и двете се четат много по-добре и изглеждат по-праволинейни от

para[para.length] = x

Това ме отблъсна за секунда, тъй като в нединамичните езици това би ви дало грешка. Съветвам ви да използвате един от тях вместо това, просто защото е по-четлив.

person domvoyt    schedule 24.05.2012

Вашият код е като c код за мен, ruby way трябва да е това, което замества вашите горни 100 реда.

File.write "dest.txt", File.read("src.txt")
person c2h2    schedule 24.05.2012

По-лесно е да използвате многоредов регулярен израз. Може би:

source_file.read.gsub(/(?<!\n)\n([a-z])/im, ' \\1')
person pguardiario    schedule 24.05.2012