in reply to Re: read text table
in thread read text table

Hello Kwun,

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