From: Rob Biedenharn Date: 2009-03-14T04:19:42+09:00 Subject: Re: reading data files with headers and columns If you know how many header lines, I'll assume 3, just read them first before you start the loop: headers = [] rows = [] File.open("your_filename", 'r') do |file| 3.times { headers << file.gets } file.each do |line| rows << line.split(' ') # or ',' or /,\s*/ depending # on how "columns" are formed end end # the block given to File.open will automatically close the file # for the value in 3rd column, 4th row (counting from ZERO) rows[3][2] # do your calculations, then open the same or a new file for writing: File.open("your_output", 'w') do |file| file.puts headers rows.each do |row| file.puts row.join(' ') # or however you separate columns end end -Rob Rob Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com On Mar 13, 2009, at 2:30 PM, Luc Traonmilin wrote: > Well [] only initializes the array as empty, if you want to > initialize it > with variables it is [var1, var2...]. Alternatively, you can use a > Hash: > @column1 = {"var1" => value, ...} > and then access the values with @column1["var1"] if that is what you > want to > do. > > I don't know what your header looks like so it is difficult to say > how to > skip it. Maybe it is possible for you to match the line against the > pattern > of your columns if you just want to skip the header. Or if you have > a fixed > number of lines, you can use a counter. > > > > On Fri, Mar 13, 2009 at 7:02 PM, Yaj Bhattacharya > wrote: > >> Thanks very much Luc, here are a few follow up questions (complete >> noob) >> >> # here's the columns as arrays >> @column1 = [] # should this be @column1=[variable1] or just the >> empty square brackets? >> >> # open file in read mode (r) >> file = File.new("> # read each line one after another and process it >> file.each_line do |line| # where do I specify how the header is to >> be skipped, how many lines to >> #be skipped or otherwise processed? >> # process as header if necessary >> # or >> # extract your variables in the line into an array >> array = line.split("") # I am guessing that >> a space column separator >> #would be " ", does it work with arbit number of multiple spaces >> between the columns i.e. if the >> #column width is variable but between two >> # columns there are one or several spaces? >> # assign variable to column >> @column1 << array[0] >> # if @column1=[variable1] comment in the second line of the above >> code >> was not correct, then >> #where do the variables get their names? >> # ... process other columns >> end >> >> >> On Mar 13, 1:23 pm, Luc Traonmilin wrote: >>> Yaj Bhattacharya a écrit : >>> >>> >>> >>>> Hello, >>> >>>> As a noob to Ruby, I need to read a data file with the first few >>>> lines >>>> as header, then the rest of the file as columns of different >>>> variables >>>> as arrays (in this case, 5 columns). >>>> After reading in the variables, I want to calculate some operations >>>> with each unique data field address (e.g. column3, row4), then >>>> write >>>> out the file with headers and data in columns. >>> >>>> Could someone help with a few lines of basic code? >>> >>>> Thanks in advance >>>> Yaj >>> >>> You could start with this basic piece of code (replace with >>> your >>> code): >>> # here's the columns as arrays >>> @column1 = [] >>> >>> # open file in read mode (r) >>> file = File.new(">> # read each line one after another and process it >>> file.each_line do |line| >>> # process as header if necessary >>> # or >>> # extract your variables in the line into an array >>> array = line.split("") >>> # assign variable to column >>> @column1 << array[0] >>> # ... process other columns >>> end >>> >>> Additionnally you can google "ruby array" and "ruby file", the API >>> docs >>> are well documented. >>> >>> Luc- Hide quoted text - >>> >>> - Show quoted text - >> > -- > Luc Traonmilin