Connecting Tech Pros Worldwide Help | Site Map

String manipulation for a date

Member
 
Join Date: Sep 2008
Posts: 35
#1: Jun 23 '09
A file contains the following contents ...

Expand|Select|Wrap|Line Numbers
  1. 20090224T105933 s990atap01      Statistics      0       curam.util.internal.workflow.intf.WorkflowQueueHandler.handleWorkflow
  2. EnactmentMessage ( java.lang.String java.lang.String java.lang.Long )   true    5608
  3. 20090224T105940 s990atap01      Statistics      0       curam.util.internal.workflow.intf.WorkflowActivityQueueHandler.handle
  4. ActivityMessage ( java.lang.String java.lang.Long java.lang.Long java.lang.Long java.lang.String )      true    7308
  5.  
I want to replace the date/time string with the following....

2009-02-24-10.59.33.000000 ......
2009-02-24-10.59.40.000000 .....

Of course, this has to repeat for the complete file.

Is there a Perl command that would do it?
KevinADC's Avatar
Expert
 
Join Date: Jan 2007
Location: Southern California USA
Posts: 4,091
#2: Jun 24 '09

re: String manipulation for a date


There is no perl command to do that but you could use a regexp to capture the date part of the string/line (or maybe another way depending on how the actual data is) and use unpack (or a regexp) and sprintf to reformat it like you want.
Member
 
Join Date: Sep 2008
Posts: 35
#3: Jun 24 '09

re: String manipulation for a date


What would the regular expression look like?
KevinADC's Avatar
Expert
 
Join Date: Jan 2007
Location: Southern California USA
Posts: 4,091
#4: Jun 24 '09

re: String manipulation for a date


Quote:

Originally Posted by joeferns79 View Post

What would the regular expression look like?

probably something like:

Expand|Select|Wrap|Line Numbers
  1. /searchpattern/
Member
 
Join Date: Sep 2008
Posts: 35
#5: Jun 25 '09

re: String manipulation for a date


Man, you truly are an Expert, aren't you? :-)
KevinADC's Avatar
Expert
 
Join Date: Jan 2007
Location: Southern California USA
Posts: 4,091
#6: Jun 25 '09

re: String manipulation for a date


My wife always says I am. My kids are generally less complimentary though.
Member
 
Join Date: Sep 2008
Posts: 35
#7: Aug 21 '09

re: String manipulation for a date


Kevin,

I got the following code for this ...

Expand|Select|Wrap|Line Numbers
  1. #!/usr/bin/perl
  2.  
  3. $mystring = "20090216T131131";
  4. print "The input is $mystring";
  5. printf "\n";
  6. @myarray = ($mystring =~ m/(\d+)/g);
  7. $result = join("", @myarray);
  8. my ($y,$m,$d,$h,$min,$sec) = unpack("A4A2A2Z2Z2Z2",$result);
  9. $done = sprintf ("%d-%2.2d-%d-%d.%d.%d.%06s",$y,$m,$d,$h,$min,$sec,0);
  10. print "$done";
  11. printf "\n";
  12.  
which returns the following ...

Expand|Select|Wrap|Line Numbers
  1. bash-3.00$ ./test.pl
  2.  
  3. The input is 20090216T131131
  4. 2009-02-16-13.11.31.000000
  5.  
  6.  
The problem is i've got a file that contains a number of occurrences of the timestamp, eg
Expand|Select|Wrap|Line Numbers
  1. 20090224T105710 fem.facade.intf.caseSearch
  2. 20090224T105710 codetable.intf.CodeTable
  3. 20090224T105719 intf.FieldLevelSecurityRuntime
  4. 20090224T105723 resolveCase
  5. 20090224T105724 FieldLevelSecurity
  6.  
If I need to use the code above to change all the occurences of a timestamp, one at a time, to the format specified, and feed those back into the file, how should I go about it?

i.e. I want to change 20090224T105710 to 2009-02-24-10.57.10.000000,
20090224T105719 to 2009-02-24-10.57.19.000000, and so on.
KevinADC's Avatar
Expert
 
Join Date: Jan 2007
Location: Southern California USA
Posts: 4,091
#8: Aug 22 '09

re: String manipulation for a date


Expand|Select|Wrap|Line Numbers
  1. open(my $data, "<", "path/to/your/file") or die "$!"; 
  2. while(my $mystring = <$data>){
  3.    print "The input is $mystring";
  4.    my ($date, $otherstuff) = split(/\s+/,$mystring);
  5.    my ($y,$m,$d,$h,$min,$sec) = unpack("A4A2A2Z2Z2Z2",$date);
  6.    my $done = sprintf ("%d-%2.2d-%d-%d.%d.%d.%06s",$y,$m,$d,$h,$min,$sec,0);
  7.    print "$done\n";
  8. }
  9. close $data;
  10.  
numberwhun's Avatar
Site Moderator
 
Join Date: May 2007
Location: New Hampshire
Posts: 2,565
#9: Aug 22 '09

re: String manipulation for a date


Please use square brackets for code tags instead of angle brackets and you will get the desired effect that we require. Thanks!

Regards,

Jeff
Member
 
Join Date: Sep 2008
Posts: 35
#10: Aug 24 '09

re: String manipulation for a date


Kevin,

After changing my code I now get only the dates ...

2009-02-24-10.57.10.000000
2009-02-24-10.57.10.000000
2009-02-24-10.57.19.000000
2009-02-24-10.57.23.000000
2009-02-24-10.57.24.000000
2009-02-24-10.57.50.000000
2009-02-24-10.57.50.000000
2009-02-24-10.57.50.000000
2009-02-24-10.57.50.000000
2009-02-24-10.57.50.000000
2009-02-24-10.51.8.000000
2009-02-24-10.51.8.000000
2009-02-24-10.51.8.000000
2009-02-24-10.51.16.000000
2009-02-24-10.54.4.000000
2009-02-24-10.54.4.000000

I do not get the rest of the line, i.e.

I should be getting ...

2009-02-24-10.57.10.000000 fem.facade.intf.caseSearch
2009-02-24-10.57.10.000000 codetable.intf.CodeTable
2009-02-24-10.57.19.000000 intf.FieldLevelSecurityRuntime
2009-02-24-10.57.23.000000 resolveCase

.. so on
KevinADC's Avatar
Expert
 
Join Date: Jan 2007
Location: Southern California USA
Posts: 4,091
#11: Aug 24 '09

re: String manipulation for a date


change:

Expand|Select|Wrap|Line Numbers
  1.  print "$done\n";
to:

Expand|Select|Wrap|Line Numbers
  1.    print "$done $otherstuff\n";
Member
 
Join Date: Sep 2008
Posts: 35
#12: Aug 24 '09

re: String manipulation for a date


Thanks, Kevin. Appreciate it.
Newbie
 
Join Date: Aug 2009
Location: Los Angeles, CA
Posts: 2
#13: Aug 25 '09

re: String manipulation for a date


IMHO, unpack seems like a lot of extra work.

Try this one-liner using regular expression:

Expand|Select|Wrap|Line Numbers
  1. $ perl -pi.bak -e 's/(....)(..)(..)T(..)(..)(..)/$1-$2-$3-$4.$5.$6.000000/' /tmp/junk.txt
  2.  
numberwhun's Avatar
Site Moderator
 
Join Date: May 2007
Location: New Hampshire
Posts: 2,565
#14: Aug 27 '09

re: String manipulation for a date


Quote:

Originally Posted by markhu View Post

IMHO, unpack seems like a lot of extra work.

Try this one-liner using regular expression:

Expand|Select|Wrap|Line Numbers
  1. $ perl -pi.bak -e 's/(....)(..)(..)T(..)(..)(..)/$1-$2-$3-$4.$5.$6.000000/' /tmp/junk.txt

And if your going to do that, take it one step further and do:

Expand|Select|Wrap|Line Numbers
  1. $ perl -pi.bak -e 's/(\d{,4})(\d{,2})(\d{2})T(\d{,2})(\d{,2})(\d{,2})/$1-$2-$3-$4.$5.$6.000000/' /tmp/junk.txt
  2.  
A bit more elegant, but also untested at the moment, but should work none the less (unless I, without looking, messed up the options in the curly brackets).

By the way, please do use code tags around any code you put into the forums. Even command likes as you have put here as they essentially have code in them.

Regards,

Jeff
nithinpes's Avatar
Expert
 
Join Date: Dec 2007
Posts: 400
#15: Aug 27 '09

re: String manipulation for a date


Jeff's command should have been:

Expand|Select|Wrap|Line Numbers
  1. perl -pi.bak -e 's/(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})/$1-$2-$3-$4.$5.$6.000000/' /tmp/junk.txt
  2.  
\d{,4} will set an upper limit of 4 occurences for digits(max. 4 digits) and not exact 4 occurences as in \d{4} (which is appropriate for the given sample data).
numberwhun's Avatar
Site Moderator
 
Join Date: May 2007
Location: New Hampshire
Posts: 2,565
#16: Aug 27 '09

re: String manipulation for a date


Quote:

Originally Posted by nithinpes View Post

Jeff's command should have been:

Expand|Select|Wrap|Line Numbers
  1. perl -pi.bak -e 's/(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})/$1-$2-$3-$4.$5.$6.000000/' /tmp/junk.txt
  2.  
\d{,4} will set an upper limit of 4 occurences for digits(max. 4 digits) and not exact 4 occurences as in \d{4} (which is appropriate for the given sample data).

See, that's why I included the "if". I couldn't remember right off if the comma should be there or not and couldn't get up the energy to dig for my reference sheet. Thanks!

Jeff
Reply