0

ファイルを2つのファイルに分割したい。ファイル名がの場合、またはexample.txtのように2つのファイルに分割されます。EX1.txtEX2.txt

分割は、各行の2番目のフィールドによって異なります。例:HDRラインにTEA0038904592番​​目のフィールドがある場合、出力はになりますがEX1.txt 、HDRにあるTEA003886004場合、出力はになりEX2.txtます。クレーム数も数えたいです。

次のロジックを使用してこれを実行したいと思います。

if Header-Row then
    if Dummy cost center then
        write to Gas file
        keep in mind: Claim-Nummer (eg. Array or Hash)
    else
        write to normal file
    end if
else if Detail-Row then
    if kept Claim-Nummer then
        write to Gas file
    else
       write to normal file
    end if
end if

このファイルには、次のデータが含まれています。

HDR^TEA003890459^082582^Mohd Jamil^Jamili Fahmi Bin^^458^+^92000^+^92000^+^0000^+^0000^+^0000^^0^^0^^0^^0^^0^^0^20130307^^^^^^^222^MY0BD^2^jamilifahmi.mohdjamil@se1.bp.com^      MY0BCC#6482362304                                 
DTL^TEA003890459^E^MY0BCC#6482362304              641301137^+^47000^MFA^20130209^Medical Expenses [Family]^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Medical
DTL^TEA003890459^E^MY0BCC#6482362304              641301137^+^45000^MGE^20130304^Medical Expenses  (Employee clinica^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Medical
HDR^TEA003886004^082770^Bin Omar^Mohamad Fadzlizam^^458^+^135800^+^135800^+^0000^+^0000^+^0000^^0^^0^^0^^0^^0^^0^20130307^^^^^^^222^MY0BD^4^mohamad.omar@se1.bp.com^      MY0BCC#6485163100                                 
DTL^TEA003886004^E^MY0BCC#6485163100              641301137^+^25000^MFA^20130221^Medical Expenses [Family]^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Claim
DTL^TEA003886004^E^MY0BCC#6485163100              641301137^+^37150^MFA^20130224^Medical Expenses [Family]^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Claim
DTL^TEA003886004^E^MY0BCC#6485163100              641301137^+^23650^MFA^20130226^Medical Expenses [Family]^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Claim
DTL^TEA003886004^E^MY0BCC#6485163100              641301137^+^50000^MGE^20130304^Medical Expenses  (Employee clinica^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Claim
HDR^TEA003886162^082792^Lim^Jia Jieh^^458^+^280400^+^280400^+^0000^+^0000^+^0000^^0^^0^^0^^0^^0^^0^20130305^^^^^^^222^MY0BD^4^jia_jieh.lim@se1.bp.com^      MY0BCC#6482363474                                 
DTL^TEA003886162^E^MY0BCC#6482363474              641301137^+^110000^MGE^20130131^Medical Expenses  (Employee clinica^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Medical claim 31/1,20/2,28/2
DTL^TEA003886162^E^MY0BCC#6482363474              641301137^+^60000^MGE^20130220^Medical Expenses  (Employee clinica^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Medical claim 31/1,20/2,28/2
DTL^TEA003886162^E^MY0BCC#6482363474              641301137^+^50400^MGE^20130220^Medical Expenses  (Employee clinica^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Medical claim 31/1,20/2,28/2
DTL^TEA003886162^E^MY0BCC#6482363474              641301137^+^60000^MGE^20130228^Medical Expenses  (Employee clinica^^^0^^0^^0^^0^^0^^0^^0^^0^^C16Medical claim 31/1,20/2,28/2
4

2 に答える 2

0

あなたの説明と疑似コードとサンプルデータは、別の話をしているようです

ただし、ファイルが開かれ、説明どおりにソートされたら、2 番目のフィールドを読み取るには

open(my $ex1,">EX1.txt")||die"EX1.txt $!";
open(my $ex2,">EX2.txt")||die"EX2.txt $!";
$wanted="TEA003890459";
while($line = <$ifile>) {

   @field=split('\^',$line);
   if ($field[1] eq $wanted) {    # fields start from 0 so 1 is the second field
     print $ex1 $line;
   else {
     print $ex2 $line;
   }
}

編集:分割引数を修正

于 2013-03-20T13:46:21.437 に答える
0

何かのようなもの:

#!/usr/bin/perl

foreach (<>) {
        my @out = split(/\^/,$_);
        if ($out[0] eq 'HDR') {
                close OUTFILE;
                open OUTFILE,">>$out[1].txt" or die();
        } elsif ($out[0] eq 'DTL') {
                print OUTFILE $_;
        }
}

実行:

./split.pl < infile.txt

ヘッダーの種類ごとにファイルに分割されます。Linux の wc コマンドを使用して、それぞれのエントリをカウントできます。

于 2013-03-20T13:47:31.273 に答える