Date Format Change - Help request

Newbie question about changing a date format

I have a series of data files in the format:
ABC, 7/21/2005, 1825
CNC1, 7/28/2005, 34.21
BPR, 9/3/2006, 34872

I need to output it to a DIFFERENT Directory as
ABC, 20050721, 1825
CNC1, 20050728, 34.21
BPR, 20060903, 34872

code snippet below

Find.find(sourcedir) do |path|
   if File.file? path
      puts path
      log.puts path
      output = path.gsub(sourcedir, destdir) # name/dir change for
output file
      data = File.readlines(path)
      data.each { |row|
        (machine, date, produced) = row.split(/,/)
        (tmonth, tday, tyear) = date.split(/\//)
        newdate = tyear + "%02d" % tmonth + "%02d" % tday
        date = newdate
        log2.puts machine + " , "+ date + " , " + newdate
      }
      log.puts "Outputting file " + output
      open(output,'w') {|f| f.puts data}
   end
end

I get the file output to the proper location, but the DATE format does
not change.
The log2 shows output in the proper format, the date and newdate ARE the
same.
The output file is still the same as the original input file.

Not sure what I am missing, but any assistance is appreciated.

···

--
Posted via http://www.ruby-forum.com/.

Hi,

the #each method does not modify the contents of the item that is being looped over. I would use #map. You have the data you want to modify on this array, so call data.map {|row| ...} and do your text transformation inside the block. The last line is what counts, so to transform data[] as you have described, the last line in the block should be 'machine + " , "+ date + " , " + newdate', you don't need "puts" or anything.

Dan

Snoopy Dog wrote:

Newbie question about changing a date format

I have a series of data files in the format:
ABC, 7/21/2005, 1825
CNC1, 7/28/2005, 34.21
BPR, 9/3/2006, 34872

I need to output it to a DIFFERENT Directory as
ABC, 20050721, 1825
CNC1, 20050728, 34.21
BPR, 20060903, 34872

code snippet below

Find.find(sourcedir) do |path|
   if File.file? path
      puts path
      log.puts path
      output = path.gsub(sourcedir, destdir) # name/dir change for
output file
      data = File.readlines(path)
      data.each { |row|
        (machine, date, produced) = row.split(/,/)
        (tmonth, tday, tyear) = date.split(/\//)
        newdate = tyear + "%02d" % tmonth + "%02d" % tday
        date = newdate
        log2.puts machine + " , "+ date + " , " + newdate
      }
      log.puts "Outputting file " + output
      open(output,'w') {|f| f.puts data}
   end
end

I get the file output to the proper location, but the DATE format does
not change.
The log2 shows output in the proper format, the date and newdate ARE the
same.
The output file is still the same as the original input file.

Not sure what I am missing, but any assistance is appreciated.

Find.find(sourcedir) do |path|
    if File.file? path
       puts path
       log.puts path
       output = path.gsub(sourcedir, destdir) # name/dir change for
output file
       data = File.readlines(path)
       data.each { |row|
         (machine, date, produced) = row.split(/,/)
         (tmonth, tday, tyear) = date.split(/\//)
         newdate = tyear + "%02d" % tmonth + "%02d" % tday
         date = newdate
         log2.puts machine + " , "+ date + " , " + newdate
       }
       log.puts "Outputting file " + output
       open(output,'w') {|f|
         data.each{|row|
           (machine, date, produced) = row.split(/,/)
           (tmonth, tday, tyear) = date.split(/\//)
           newdate = tyear + "%02d" % tmonth + "%02d" % tday
           date = newdate
           f.write
         }
       }
    end
end

Dan Zwell wrote:

Hi,

the #each method does not modify the contents of the item that is being
looped over. I would use #map. You have the data you want to modify on
this array, so call data.map {|row| ...} and do your text transformation
inside the block. The last line is what counts, so to transform data[]
as you have described, the last line in the block should be 'machine + "
, "+ date + " , " + newdate', you don't need "puts" or anything.

Dan

THANK YOU DAN

I ended up using

  data.map! (|row|

as the control and added the line
   machine + ", " + newdate + ", " + produced

as the last line in the block to get my desired result.

Thanks for your help

···

--
Posted via http://www.ruby-forum.com/.