Can i identify tis pattern (.*|)3 times and have a \n inserted after that?
You haven't mentioned how large the file is. If it fits into memory, you can read the file into a string and then do
while ($s =~ /(.*?)\|(.*?)\|(.*?)\|/g) { print "$1\t$2\t$3\n"; }
or, if you want to keep the pipe symbols as is
while ($s =~ /((?:.*?\|){3})/g) { print "$1\n"; }
In case the file is huge, you can do instead
local $/ = "|"; # set input record separator while (<>) { print $_, scalar <>, scalar <>, "\n"; }
(requires that you have multiples of 3 number of "...|" items (when using <>) — otherwise you'd have to test for eof in between reading the records)
Update: or simply use the modulus operator (%) to insert a \n after every 3 records:
local $/ = "|"; while (<>) { print; print "\n" unless $. % 3; }
In reply to Re: Parsing a Pipe delimied file
by Eliya
in thread Parsing a Pipe delimied file
by anjamesc
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |