Date Format Change - Help request

Discussion in 'Ruby' started by Snoopy Dog, Apr 26, 2007.

  1. Snoopy Dog

    Snoopy Dog Guest

    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/.
    Snoopy Dog, Apr 26, 2007
    #1
    1. Advertising

  2. Snoopy Dog

    Dan Zwell Guest

    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, Apr 27, 2007
    #2
    1. Advertising

  3. Snoopy Dog

    Snoopy Dog Guest

    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/.
    Snoopy Dog, Apr 27, 2007
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Brian Candy
    Replies:
    2
    Views:
    1,150
    Janaka
    Feb 18, 2004
  2. DC
    Replies:
    5
    Views:
    2,995
    Brendan Reynolds
    Jul 1, 2005
  3. Peter Grison

    Date, date date date....

    Peter Grison, May 28, 2004, in forum: Java
    Replies:
    10
    Views:
    3,230
    Michael Borgwardt
    May 30, 2004
  4. Chu
    Replies:
    3
    Views:
    4,176
    Shawn
    Aug 15, 2006
  5. Josh Sharpe
    Replies:
    1
    Views:
    196
    Brian Candler
    Sep 21, 2010
Loading...

Share This Page