Alle gioved20 settembre 2007, Dan George ha scritto: > On Sep 20, 11:51 am, Stefano Crocco <stefano.cro... / alice.it> wrote: > > Alle gioved20 settembre 2007, Dan George ha scritto: > > > On Sep 20, 1:41 am, Stefano Crocco <stefano.cro... / alice.it> wrote: > > > > Alle gioved20 settembre 2007, Dan George ha scritto: > > > > > On Sep 20, 12:39 am, Stefano Crocco <stefano.cro... / alice.it> wrote: > > > > > > Alle mercoled19 settembre 2007, Dan George ha scritto: > > > > > > > CATEG being another line inside the text files... and the > > > > > > > problem might be because the Name-line isn't always above the > > > > > > > Link-line. I could have n lines between or below, what I'm > > > > > > > trying to say is that I don't know where the Name-line is > > > > > > > inside the texts files. > > > > > > > > > > > > This changes everything. I assumed (according to the example > > > > > > lines you posted) that each Link-line had the corresponding > > > > > > Name-line above it. But, if there isn't a relation between the > > > > > > position of the two kind of lines, how can you know what to put > > > > > > in the link line? I mean, what is the relation which connects a > > > > > > Link-line and the corresponding Name-line? Since (from what you > > > > > > say now) the position of the two kind of lines are random (as far > > > > > > as this problem is concerned, at any rate) are you able, given a > > > > > > single Link-line, to understand which is the corresponding > > > > > > Name-line? If yes, how? Whithout knowing this, I can't help you. > > > > > > > > > > > > Stefano > > > > > > > > > > All I can say is that in each text file there will only be one > > > > > Name- line and one Link-line. The only connection between this 2 > > > > > lines is that the Link uses the shorter version of what is written > > > > > in the Name- line (i.e. if the Name-line: New York the Link line > > > > > will use NY) > > > > > > > > > > Isn't it possible to read the Name-line, take the correspond value > > > > > from the YAML file, store it in a variable (string?) inside the > > > > > code and then use it in the Link-line, when going to the next text > > > > > file read again the Name-line and take the value from YAML and so > > > > > on... > > > > > > > > If each file contains only one Name-line and one instance of the > > > > corresponding Link-line, this should work: > > > > > > > > require 'yaml' > > > > > > > > lnk='blabla.something.' > > > > op = '&=bla' > > > > hash = File.open('name.yaml'){|f| YAML.load f} > > > > > > > > Dir.glob('**/*.txt').each do |f| > > > > lines = File.readlines f > > > > name = nil > > > > link_idx = nil > > > > lines.each_with_index do |l, i| > > > > if l.match(/Name-line:\s+(.*)$/) then name $1 > > > > elsif l.match(/Link-line/) then link = i > > > > end > > > > break if name and link_idx > > > > end > > > > if name > > > > rep = hash[name] > > > > if rep > > > > lines[link_idx]="Link-line: #{lnk}#{rep}#{op}" > > > > File.open(f, 'w'){|of| of.write lines} > > > > else puts "name.yaml doesn't contain an entry for #{name} (file > > > > #{f})" end > > > > else puts "Couldn't find a Name line in file #{f}" > > > > end > > > > end > > > > > > > > For each file, it loops each line looking for a Name-line or a > > > > Link-line. When it finds the former, it stores the name in the name > > > > variable; when it finds the latter, it stores its index in the > > > > link_idx variable. When both are found, the loop stops (no point in > > > > examining the remaining lines). If a name has been found and it > > > > corresponds to an entry in the hash, the line with index link_idx is > > > > replaced with a new one (I removed the call to gsub!, since we're > > > > rebuilding the entire line, but you can put it back, if you need > > > > it), then the array is written to the file. If the Name-line wasn't > > > > found, or if the hash doesn't contain an entry for it, an error > > > > message is printed on screen and the next file is processed. > > > > > > > > I hope this helps > > > > > > > > Stefano > > > > > > Thanks for your reply Stefano! > > > > > > I had to do: > > > link_idx = nil.to_i > > > otherwise I would get this error: `[]': no implicit conversion from > > > nil to integer (TypeError) > > > > > > And it seems to be working but if I use this: > > > lines[link_idx]="Link-line: #{lnk}#{rep}#{op}" > > > the Name-line is removed and is replaced by the "Link-line: > > > #{lnk}#{rep}#{op}" but the old Link-line = 0 is kept too. > > > > > > If I use > > > lines[link_idx].gsub!(/Link-line.*/, 'Link-line: '+lnk+rep > > > +op) > > > nothing happends, no errors, no modified files, no nothing. > > > > > > I don't see anything wrong with the gsub! so what might be the problem? > > > > Another couple of mistakes on my part, I'm afraid. This should work > > > > require 'yaml' > > > > lnk='blabla.something.' > > op = '&=bla' > > hash = File.open('name.yaml'){|f| YAML.load f} > > > > Dir.glob('**/*.txt').each do |f| > > lines = File.readlines f > > name = nil > > link_idx = nil > > lines.each_with_index do |l, i| > > #added missing = between name and $1 > > if l.match(/Name-line:\s+(.*)$/) then name = $1 > > #changed link = i to link_idx = i > > elsif l.match(/Link-line/) then link_idx = i > > end > > break if name and link_idx > > end > > #checking that also link_idx is not nil > > if name and link_idx > > rep = hash[name] > > if rep > > lines[link_idx]="Link-line: #{lnk}#{rep}#{op}" > > File.open(f, 'w'){|of| of.write lines} > > else puts "name.yaml doesn't contain an entry for the name #{name}" > > end > > #changed the error message > > else puts "Name or Link line are missing in file #{f}" > > end > > end > > > > Stefano > > Thank you Stefano! Works like a charm now :) > > This part (#added missing = between name and $1 ) I figured it too but > I should have been more careful about this part "#checking that also > link_idx is not nil" > > I liked the #comments part, thank you! > > Now I'm gonna try and search for text files inside a zip archive and > modify them and then zip them back together. > > Stefano, how long have you been using Ruby because you seem to know a > lot of stuff and I was wondering how long it will take me to know half > of what you know? I've been using ruby for about two years. And don't worry: you only need a little time to get to know the language, then progresses become much quicker. Stefano