By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
438,372 Members | 1,906 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 438,372 IT Pros & Developers. It's quick & easy.

String manipulation for a date

P: 37
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?
Jun 23 '09 #1
Share this Question
Share on Google+
15 Replies


KevinADC
Expert 2.5K+
P: 4,059
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.
Jun 24 '09 #2

P: 37
What would the regular expression look like?
Jun 24 '09 #3

KevinADC
Expert 2.5K+
P: 4,059
@joeferns79
probably something like:

Expand|Select|Wrap|Line Numbers
  1. /searchpattern/
Jun 24 '09 #4

P: 37
Man, you truly are an Expert, aren't you? :-)
Jun 25 '09 #5

KevinADC
Expert 2.5K+
P: 4,059
My wife always says I am. My kids are generally less complimentary though.
Jun 25 '09 #6

P: 37
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.
Aug 21 '09 #7

KevinADC
Expert 2.5K+
P: 4,059
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.  
Aug 22 '09 #8

numberwhun
Expert Mod 2.5K+
P: 3,503
Please use square brackets for code tags instead of angle brackets and you will get the desired effect that we require. Thanks!

Regards,

Jeff
Aug 22 '09 #9

P: 37
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
Aug 24 '09 #10

KevinADC
Expert 2.5K+
P: 4,059
change:

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

Expand|Select|Wrap|Line Numbers
  1.    print "$done $otherstuff\n";
Aug 24 '09 #11

P: 37
Thanks, Kevin. Appreciate it.
Aug 24 '09 #12

P: 2
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.  
Aug 25 '09 #13

numberwhun
Expert Mod 2.5K+
P: 3,503
@markhu
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
Aug 27 '09 #14

nithinpes
Expert 100+
P: 410
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).
Aug 27 '09 #15

numberwhun
Expert Mod 2.5K+
P: 3,503
@nithinpes
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
Aug 27 '09 #16

Post your reply

Sign in to post your reply or Sign up for a free account.