The following code will work PROVIDED there is always an entry in the FROM, DEPT, TO, ARR fields. It looks for the second pipe symbol, (|), and gets the rest of the line after it. Hope this helps.
Chris
#!/usr/bin/perl use strict; use warnings; while (<DATA>) { next unless /Bus Timetable/; <DATA> for 1..3; my $line; until (($line = <DATA>) =~ /^\+/) { # Find index of the first '|' after the first one. my $idx = index($line, "|", 1); # From that position (+2), capture the remaining string $line = substr($line, $idx+2); # Remove the '|' characters $line =~ s/\|//g; # Capture the first four fields my ($fr, $dep, $to, $arr) = split ' ', $line; print "$fr$dep:$to$arr\n"; } } __DATA__ ---TEXT BEFORE--- +---------------+ | Bus Timetable | +---------------+----+------------+-----------+------+ | BUS SERVICE DAY tm | FROM DEPT | TO ARR | 24/7 | +--------------------+------------+-----------+------+ | C4 metro mon 15 | twn 0900 | Apt 1011 | yes | | C6 intl mon 45 | LDN 1000 | XTR 1426 | no | | B2 susx mon 20 | cly 1034 | btn 1118 | no | | A0 xxxxx xxx xx | xxx xxxx | xxx xxxx | xxx | +--------------------+------------+-----------+------+ ---TEXT AFTER--- +---------------+ | Bus Timetable | +---------------+----+-----------------+------------+------+ | BUS SERVICE DAY tm | FROM DEPT | TO ARR | 24/7 | +--------------------+-----------------+------------+------+ | C4 mon 15 | twn 0900 | Apt 1011 | yes | | intl mon | LoDoN 1000 | XTR 1426 | | | B2 sussex 20 | cly 1034 | brgtn 1118 | no | | A0 | manchester 1212 | xxx xxxx | xxx | +--------------------+-----------------+------------+------+ **** RESULTS ******* *********************** twn0900:Apt1011 LDN1000:XTR1426 cly1034:btn1118 xxxxxxx:xxxxxxx twn0900:Apt1011 LoDoN1000:XTR1426 cly1034:brgtn1118 manchester1212:xxxxxxx
In reply to Re: Re: read text table
by Anonymous Monk
in thread read text table
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |