Forum: Ruby Date Format Change - Help request

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Snoopy D. (Guest)
on 2007-04-27 02:26
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.
Dan Z. (Guest)
on 2007-04-27 05:44
(Received via mailing list)
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 D. wrote:
> BPR, 20060903, 34872
>       data.each { |row|
>
> 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
Snoopy D. (Guest)
on 2007-04-27 07:16
Dan Z. 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
This topic is locked and can not be replied to.