2012-01-06 1 views
3

私はレコードのフラットファイルをそれぞれ33行持っています。このファイルをテンプレートのスペックにフォーマットする必要があります。テンプレートはDOS形式で、ソースファイルはNIX形式です。テンプレートには、特定のインデントとスペーシングが付いていなければなりません。 Perlのは テンプレートツールキットとBASH BASH:フラットファイルからテンプレートにデータをインポートする

  • のPerl EITHテンプレートツールキット
  • ...けれども、sed、awk、grepのなど:古典nixのツールと

    • BASH:私はいくつかのオプションを考えてきました

    これは私の熟知している順です。ここではサンプルソースレコード(NIX形式)です: 私はスペースを節約するために改行の数(通常は33行)を削減しました:

    JACKSON HOLE SANITARIUM AND REPTILE ZOO 
    45 GREASY HOLLER LN 
    JACKSON HOLE, AK 99999 
    
    
    Change Service Requested 
    
    
    BUBBA HOTEP 
    3 DELIVERANCE RD 
    MINNEAPOLIS, MN 99998 
    
    
    BUBBA HOTEP 09090909090909 
    
    You have a hold available for pickup as of 2012-01-04: 
    
    Title: Banjo for Fun and Profit 
    Author: Williams, Billy Dee 
    Price: $10 
    

    ここテンプレート(DOSフォーマット - 縮小ライン - 通常66行)があります:

     <%BRANCH-NAME%> 
        <%BRANCH-ADDR%> 
        <%BRANCH-CTY%> 
    
    
    <%CUST-NAME%> <%BARCODE%> 
    You have a hold available for pickup as of <%DATE%>: 
    
    Title: <%TITLE%> 
    Author: <%AUTHOR%> 
    Price: <%PRICE%> 
    
    
          <%CUST-NAME%> 
          <%CUST-ADDR%> 
          <%CUST-CTY%> 
    
    end of file 
    

    実際には、各レコードの最後に「ファイルの終わり」と表示されます。

    思考?私は事を複雑にする傾向がある。アップデート2

    はそれを考え出しました。

    私の答えは以下の通りです。お気軽に改善を提案してください。場合(<>)でSTDINから読み出しラインとダミー入力配列を交換

    #!/usr/bin/perl 
    use strict; 
    use warnings; 
    
    my @lines = qw/branchname cust_name barcode bogus whatever/; # (<>); 
    
    my ($branchname, $cust_name, $barcode, undef, $whatever) = @lines; 
    
    print <<TEMPLATE; 
        $branchname 
        <%BRANCH-ADDR%> 
        <%BRANCH-CTY%> 
    
    
    $cust_name $barcode 
    You have a hold available for pickup as of <%DATE%>: 
    
    Title: <%TITLE%> 
    Author: <%AUTHOR%> 
    Price: <%PRICE%> 
    
    
          $cust_name 
          <%CUST-ADDR%> 
          <%CUST-CTY%> 
    
    end of file 
    TEMPLATE 
    

    :Perlのヒアドキュメント(デモとしてほんの数の置換を示す):スターターとして

  • +0

    多分、コマンドラインからPHPを使用しますか?正しいとすれば、それはあなたに将来のWebインターフェイスのためのresuableコンポーネントを無料で提供します... –

    +0

    提案のおかげでオイゲン、しかし私はこの事をwebify - されません、私はPHPを知らない。 – Bubnoff

    +0

    ''ファイルをテンプレートのスペックにフォーマットする 'と言うとき、レコードを含むファイルで何をしたいのですか? –

    答えて

    0

    これは私がこのプロジェクトのために使用していますものです。お気軽に改善を提案するか、より良い解決策を提出してください。

    cp $FILE $WORKING # we won't mess with original 
    
    NUM_RECORDS=$(grep "^Price:" "$FILE" | wc -l) # need to know how many records we have 
                   # counting occurences of end of record r 
    
    TMP=record.txt # holds single record, used as temp storage in loop below 
    
    # Sanity 
    # Make sure temp storage exists. If not create -- if so, clear it. 
    [ ! -f $TMP ] && touch $TMP || cat /dev/null >$TMP 
    
    # functions 
    function make_template() { 
        local _file="$1" 
        mapfile -t filecontent < "$_file" 
        _loc_name="${filecontent[0]}" 
        _loc_strt="${filecontent[1]}" 
        _loc_city="${filecontent[2]}" 
        _pat_name="${filecontent[14]}" 
        _pat_addr="${filecontent[15]}" 
        _pat_city="${filecontent[16]}" 
        _barcode=${filecontent[27]:(-14)} # pull barcode from end of string 
        _date=${filecontent[29]:(-11)} # pull date from end of string 
        # Test title length - truncate if necessary - 70 chars. 
        _title=$(grep -E "^Title:" $_file) 
        MAXLEN=70 
        [ "${#_title}" -gt "$MAXLEN" ] && _title="${filecontent[31]:0:70}" || : 
        _auth=$(grep -E "^Author:" $_file) 
        _price=$(grep -E "^Price:" $_file) 
        sed " 
         [email protected]<%BRANCH-NAME%>@${_loc_name}@g 
         [email protected]<%BRANCH-ADDR%>@${_loc_strt}@g 
         [email protected]<%BRANCH-CTY%>@${_loc_city}@g 
         [email protected]<%CUST-NAME%>@${_pat_name}@g 
         [email protected]<%CUST-ADDR%>@${_pat_addr}@ 
         [email protected]<%CUST-CTY%>@${_pat_city}@ 
         [email protected]<%BARCODE%>@${_barcode}@g 
         [email protected]<%DATE%>@${_date}@ 
         [email protected]<%TITLE%>@${_title}@ 
         [email protected]<%AUTHOR%>@${_auth}@ 
         [email protected]<%PRICE%>@${_price}@" "$TEMPLATE" 
    } 
    
    #################################### 
    # MAIN 
    #################################### 
    
    for((i=1;i<="$NUM_RECORDS";i++)) 
    do 
        sed -n '1,/^Price:/{p;}' "$WORKING" >"$TMP" # copy first record with end of record 
                   # and copy to temp storage. 
    
        sed -i '1,/^Price:/d' "$WORKING"    # delete first record using EOR regex. 
        make_template "$TMP"      # send temp file/record to template fu 
    done 
    
    # cleanup 
    exit 0 
    
    1

    は、ここにヒントでありますあなたはするであろう。 (ループを使用してnの行を使用し、それが効率的であれば配列にプッシュします)。私はちょうどその要点を示し、必要に応じて変数を追加し、(図のように) 'キャプチャ'変数にundefを指定して入力行をスキップします。

    ここで、これらの変数をテキストに補間するだけです。

    ラインエンドがあなたに悲しみを与えている場合は、使用を検討してchomp例えば:

    my @lines = (<>); # just read em all... 
    my @cleaned = map { chomp } @lines; 
    
    +0

    これからもっと進んでいくためのヒントを少し追加しました – sehe

    +0

    他のテンプレートで再利用できるように、テンプレート部分をコードから削除する必要があります。これで作業するつもりです。 – Bubnoff

    関連する問題