String manipulation for a date | Member | | Join Date: Sep 2008
Posts: 35
| |
A file contains the following contents ... -
20090224T105933 s990atap01 Statistics 0 curam.util.internal.workflow.intf.WorkflowQueueHandler.handleWorkflow
-
EnactmentMessage ( java.lang.String java.lang.String java.lang.Long ) true 5608
-
20090224T105940 s990atap01 Statistics 0 curam.util.internal.workflow.intf.WorkflowActivityQueueHandler.handle
-
ActivityMessage ( java.lang.String java.lang.Long java.lang.Long java.lang.Long java.lang.String ) true 7308
-
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?
|  | Expert | | Join Date: Jan 2007 Location: Southern California USA
Posts: 4,091
| | | 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
| | | re: String manipulation for a date
What would the regular expression look like?
|  | Expert | | Join Date: Jan 2007 Location: Southern California USA
Posts: 4,091
| | | re: String manipulation for a date Quote:
Originally Posted by joeferns79 What would the regular expression look like? probably something like: | | Member | | Join Date: Sep 2008
Posts: 35
| | | re: String manipulation for a date
Man, you truly are an Expert, aren't you? :-)
|  | Expert | | Join Date: Jan 2007 Location: Southern California USA
Posts: 4,091
| | | 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
| | | re: String manipulation for a date
Kevin,
I got the following code for this ... -
#!/usr/bin/perl
-
-
$mystring = "20090216T131131";
-
print "The input is $mystring";
-
printf "\n";
-
@myarray = ($mystring =~ m/(\d+)/g);
-
$result = join("", @myarray);
-
my ($y,$m,$d,$h,$min,$sec) = unpack("A4A2A2Z2Z2Z2",$result);
-
$done = sprintf ("%d-%2.2d-%d-%d.%d.%d.%06s",$y,$m,$d,$h,$min,$sec,0);
-
print "$done";
-
printf "\n";
-
which returns the following ... -
bash-3.00$ ./test.pl
-
-
The input is 20090216T131131
-
2009-02-16-13.11.31.000000
-
-
The problem is i've got a file that contains a number of occurrences of the timestamp, eg -
20090224T105710 fem.facade.intf.caseSearch
-
20090224T105710 codetable.intf.CodeTable
-
20090224T105719 intf.FieldLevelSecurityRuntime
-
20090224T105723 resolveCase
-
20090224T105724 FieldLevelSecurity
-
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.
|  | Expert | | Join Date: Jan 2007 Location: Southern California USA
Posts: 4,091
| | | re: String manipulation for a date - open(my $data, "<", "path/to/your/file") or die "$!";
-
while(my $mystring = <$data>){
-
print "The input is $mystring";
-
my ($date, $otherstuff) = split(/\s+/,$mystring);
-
my ($y,$m,$d,$h,$min,$sec) = unpack("A4A2A2Z2Z2Z2",$date);
-
my $done = sprintf ("%d-%2.2d-%d-%d.%d.%d.%06s",$y,$m,$d,$h,$min,$sec,0);
-
print "$done\n";
-
}
-
close $data;
-
|  | Site Moderator | | Join Date: May 2007 Location: New Hampshire
Posts: 2,565
| | | 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
| | | 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
|  | Expert | | Join Date: Jan 2007 Location: Southern California USA
Posts: 4,091
| | | re: String manipulation for a date
change:
to: - print "$done $otherstuff\n";
| | Member | | Join Date: Sep 2008
Posts: 35
| | | re: String manipulation for a date
Thanks, Kevin. Appreciate it.
| | Newbie | | Join Date: Aug 2009 Location: Los Angeles, CA
Posts: 2
| | | re: String manipulation for a date
IMHO, unpack seems like a lot of extra work.
Try this one-liner using regular expression: -
$ perl -pi.bak -e 's/(....)(..)(..)T(..)(..)(..)/$1-$2-$3-$4.$5.$6.000000/' /tmp/junk.txt
-
|  | Site Moderator | | Join Date: May 2007 Location: New Hampshire
Posts: 2,565
| | | re: String manipulation for a date Quote:
Originally Posted by markhu IMHO, unpack seems like a lot of extra work.
Try this one-liner using regular expression: - $ 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: -
$ 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
-
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
|  | Expert | | Join Date: Dec 2007
Posts: 400
| | | re: String manipulation for a date
Jeff's command should have been: -
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
-
\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).
|  | Site Moderator | | Join Date: May 2007 Location: New Hampshire
Posts: 2,565
| | | re: String manipulation for a date Quote:
Originally Posted by nithinpes Jeff's command should have been: -
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
-
\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
|  | | | | /bytes/about
We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights.
Get the best answers to your questions from over 226,223 network members.
|