UNH+789+INVOIC:D:93A:UN:EAN007' BGM+380+1234567890' DTM+137:20040726:102' RFF+DQ:9087654321' RFF+ON:01234567' NAD+BY+9182736453627::9' RFF+VA:123987465' RFF+API:123' NAD+SU+123987658XXXX::9' RFF+VA:200XXXXXX' NAD+IV+1928374650981::9' CUX+2:EUR:4' LIN+1++230XXXXXXXXXX:EN' IMD+F+M+:::Pencils' QTY+47:70' MOA+66:114.45' PRI+AAB:5.36' PRI+AAA:1.64' ALC+A+++1+TD' PCD+1:69.495' UNS+S' CNT+2:1' MOA+139:138.48' MOA+79:114.45' MOA+125:114.45' MOA+176:24.03' MOA+98:375.20' TAX+7+VAT+++:::21' MOA+176:24.03' UNT+30+798' #### $VAR1 = { 'PDS' => { '11' => { 'SEG' => [ [ 'IV' ], [ '1928374650981', '', '9' ] ], 'CODE' => { 'DES' => 'Name and address', 'TAG' => 'NAD' } }, '21' => { 'SEG' => [ [ 'S' ] ], 'CODE' => { 'DES' => 'Section control', 'TAG' => 'UNS' } }, '7' => { 'SEG' => [ [ 'VA', '123987465' ] ], 'CODE' => { 'DES' => 'Reference', 'TAG' => 'RFF' } }, '26' => { 'SEG' => [ [ '176', '24.03' ] ], 'CODE' => { 'DES' => 'Monetary amount', 'TAG' => 'MOA' } }, '17' => { 'SEG' => [ [ 'AAB', '5.36' ] ], 'CODE' => { 'DES' => 'Price details', 'TAG' => 'PRI' } }, '2' => { 'SEG' => [ [ '380' ], [ '1234567890' ] ], 'CODE' => { 'DES' => 'Beginning of message', 'TAG' => 'BGM' } }, '22' => { 'SEG' => [ [ '2', '1' ] ], 'CODE' => { 'DES' => 'Control total', 'TAG' => 'CNT' } }, '1' => { 'SEG' => [ [ '789' ], [ 'INVOIC', 'D', '93A', 'UN', 'EAN007' ] ], 'CODE' => { 'DES' => 'Message header', 'TAG' => 'UNH' } }, '18' => { 'SEG' => [ [ 'AAA', '1.64' ] ], 'CODE' => { 'DES' => 'Price details', 'TAG' => 'PRI' } }, '30' => { 'SEG' => [ [ '30' ], [ '798' ] ], 'CODE' => { 'DES' => 'Message trailer', 'TAG' => 'UNT' } }, '23' => { 'SEG' => [ [ '139', '138.48' ] ], 'CODE' => { 'DES' => 'Monetary amount', 'TAG' => 'MOA' } }, '16' => { 'SEG' => [ [ '66', '114.45' ] ], 'CODE' => { 'DES' => 'Monetary amount', 'TAG' => 'MOA' } }, '13' => { 'SEG' => [ [ '1' ], [], [ '230XXXXXXXXXX', 'EN' ] ], 'CODE' => { 'DES' => 'Line item', 'TAG' => 'LIN' } }, '29' => { 'SEG' => [ [ '176', '24.03' ] ], 'CODE' => { 'DES' => 'Monetary amount', 'TAG' => 'MOA' } }, '27' => { 'SEG' => [ [ '98', '375.20' ] ], 'CODE' => { 'DES' => 'Monetary amount', 'TAG' => 'MOA' } }, '25' => { 'SEG' => [ [ '125', '114.45' ] ], 'CODE' => { 'DES' => 'Monetary amount', 'TAG' => 'MOA' } }, '6' => { 'SEG' => [ [ 'BY' ], [ '9182736453627', '', '9' ] ], 'CODE' => { 'DES' => 'Name and address', 'TAG' => 'NAD' } }, '28' => { 'SEG' => [ [ '7' ], [ 'VAT' ], [], [], [ '', '', '', '21' ] ], 'CODE' => { 'DES' => 'Duty/tax/fee details', 'TAG' => 'TAX' } }, '3' => { 'SEG' => [ [ '137', '20040726', '102' ] ], 'CODE' => { 'DES' => 'Date/time/period', 'TAG' => 'DTM' } }, '9' => { 'SEG' => [ [ 'SU' ], [ '123987658XXXX', '', '9' ] ], 'CODE' => { 'DES' => 'Name and address', 'TAG' => 'NAD' } }, '12' => { 'SEG' => [ [ '2', 'EUR', '4' ] ], 'CODE' => { 'DES' => 'Currencies', 'TAG' => 'CUX' } }, '20' => { 'SEG' => [ [ '1', '69.495' ] ], 'CODE' => { 'DES' => 'Percentage details', 'TAG' => 'PCD' } }, '14' => { 'SEG' => [ [ 'F' ], [ 'M' ], [ '', '', '', 'Pencils' ] ], 'CODE' => { 'DES' => 'Item description', 'TAG' => 'IMD' } }, '15' => { 'SEG' => [ [ '47', '70' ] ], 'CODE' => { 'DES' => 'Quantity', 'TAG' => 'QTY' } }, '8' => { 'SEG' => [ [ 'API', '123' ] ], 'CODE' => { 'DES' => 'Reference', 'TAG' => 'RFF' } }, '4' => { 'SEG' => [ [ 'DQ', '9087654321' ] ], 'CODE' => { 'DES' => 'Reference', 'TAG' => 'RFF' } }, '24' => { 'SEG' => [ [ '79', '114.45' ] ], 'CODE' => { 'DES' => 'Monetary amount', 'TAG' => 'MOA' } }, '19' => { 'SEG' => [ [ 'A' ], [], [], [ '1' ], [ 'TD' ] ], 'CODE' => { 'DES' => 'Allowance or charge', 'TAG' => 'ALC' } }, '10' => { 'SEG' => [ [ 'VA', '200XXXXXX' ] ], 'CODE' => { 'DES' => 'Reference', 'TAG' => 'RFF' } }, '5' => { 'SEG' => [ [ 'ON', '01234567' ] ], 'CODE' => { 'DES' => 'Reference', 'TAG' => 'RFF' } } }, 'EDI' => 'UNH+789+INVOIC:D:93A:UN:EAN007\' BGM+380+1234567890\' DTM+137:20040726:102\' RFF+DQ:9087654321\' RFF+ON:01234567\' NAD+BY+9182736453627::9\' RFF+VA:123987465\' RFF+API:123\' NAD+SU+123987658XXXX::9\' RFF+VA:200XXXXXX\' NAD+IV+1928374650981::9\' CUX+2:EUR:4\' LIN+1++230XXXXXXXXXX:EN\' IMD+F+M+:::Pencils\' QTY+47:70\' MOA+66:114.45\' PRI+AAB:5.36\' PRI+AAA:1.64\' ALC+A+++1+TD\' PCD+1:69.495\' UNS+S\' CNT+2:1\' MOA+139:138.48\' MOA+79:114.45\' MOA+125:114.45\' MOA+176:24.03\' MOA+98:375.20\' TAX+7+VAT+++:::21\' MOA+176:24.03\' UNT+30+798\' ' }; #### #!/usr/bin/perl -w use strict; use CGI; use CGI::Carp qw/fatalsToBrowser/; use Data::Dumper; my $q = new CGI; my $result = ParseEDI( { EDI => '/path/to/edis/invoice.edi', DIC => '/path/to/dics/d93a_invoic.dat', } ); print $q->header, $q->start_html, $q->start_pre; print Dumper $result; print $q->end_pre, $q->end_html; sub ParseEDI { my $self = shift; my $output = { EDI => undef, # Original message PDS => undef, # Perl Data Structure }; open ( EDI, "<", $self->{EDI} ) or die ( "Error opening EDI message"); my $i = 1; while ( ) { $output->{EDI} .= $_; my ($CODE, $VARS) = ($_ =~/^(\w{3})\+(.*)'$/); $output->{PDS}->{$i} = { CODE => { TAG => $CODE, DES => DataIndex( { DIC => $self->{DIC} } )->{$CODE}, }, SEG => [map ([map ($_ , split /:/)] , split /\+/ , $VARS)], }; $i++; } close ( EDI ); return $output; } sub DataIndex { my $self = shift; open (DIC, "<", $self->{DIC} ) or die "Error opening the data index"; my $res = {}; while () { my ($CODE, $DESC) = ($_ =~/^(\w{3}) (.*)$/ ); $res->{$CODE} = $DESC; } close DIC; return $res; }