in reply to Re^9: Sybase BCP date formatter
in thread Sybase BCP date formatter

I've included the code from my vi session with numbering turned on. Looks like it continues from line 22 to line 23.
1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 { my %mons = qw( Jan 1 Feb 2 Mar 3 Apr 4 May 5 Jun 6 Jul 7 A +ug 8 Sep 7 + 9 Oct 10 Nov 11 Dec 12 ); 8 my $mon_str = join '|', keys %mons; 9 my $mon_re = qr/$mon_str/; 10 11 sub fix_bcp_file { 12 my ( $file ) = @_; 13 local ( $^I, @ARGV ) = ( '', $file ); 14 while ( <> ) { 15 s/(^|\,)($mon_re)\s{1,2}(\d{1,2})\s(\d{4})\s\s?(\d +\d?):(\d 16 +\d):(\d\d):(\d{3})([AP])M(\,|$)/ 17 $1 . 18 sprintf( '%04d-%02d-%02d %02d:%02d:%02d.%03d', 19 $4, 20 $mons{ $2 }, 21 $3, 22 ( $9 eq 'P' && $5 < 12) ? $5 + 12 : ( $9 eq 'A +' && $5 23 +== 12 ) ? 0 : $5, 24 $6, 25 $7, 26 $8 ) . 27 $10 28 /eg; 29 print; # UPDATED thanks runrig 30 } 31 } 32 } 33 for my $file (@ARGV) { 34 fix_bcp_file($file); 35 } 36
Any ideas? Rob

Replies are listed 'Best First'.
Re^11: Sybase BCP date formatter
by Corion (Patriarch) on Dec 17, 2008 at 14:17 UTC

    This website has automatic code wrapping. It seems you didn't use the "download" link to download the code but copy'n'pasted the wrapped code. If you will look at the original node where you pasted the code from, you will note a red + sign, which is the site's way of marking a continued line. Just use the "download" link instead of copy'n'paste.

      Ah... that's it. It was the wrap. Thank you so much. I changed the delimiter to ',' instead of '|' and it appears the result is correct. However, it converts the time "Jan 28 1997 9:53:22:610AM" to "1997-01-28 09:53:22.610". Is there a way to change the date this to "1 28 1997 9:53AM"?
      #!/usr/bin/perl use strict; use warnings; { my %mons = qw( Jan 1 Feb 2 Mar 3 Apr 4 May 5 Jun 6 Jul 7 Aug 8 Sep + 9 Oct 10 Nov 11 Dec 12 ); my $mon_str = join '|', keys %mons; my $mon_re = qr/$mon_str/; sub fix_bcp_file { my ( $file ) = @_; local ( $^I, @ARGV ) = ( '', $file ); while ( <> ) { s/(^|\,)($mon_re)\s{1,2}(\d{1,2})\s(\d{4})\s\s?(\d\d?):(\d +\d):(\d\d):(\d{3})([AP])M(\,|$)/ $1 . sprintf( '%04d-%02d-%02d %02d:%02d:%02d.%03d', $4, $mons{ $2 }, $3, ( $9 eq 'P' && $5 < 12) ? $5 + 12 : ( $9 eq 'A' && $5 +== 12 ) ? 0 : $5, $6, $7, $8 ) . $10 /eg; print; # UPDATED thanks runrig } } } for my $file (@ARGV) { fix_bcp_file($file); }
      I have around 50 million lines to convert... Thanks so much for your patience and support guys! Robert

        I'm sure there is. What have you tried so far?