代码之家  ›  专栏  ›  技术社区  ›  Fadly Dzil

将文本文件解析为数组,然后根据字符串的一部分对其进行操作

  •  1
  • Fadly Dzil  · 技术社区  · 7 年前

    我有一个这样的*.txt文件:

    DTL0101I00010000-- IRBNDIRBNDIDTPPIDTPPINTERASIA PROGRESS                                0548511591                    20180505                              20180529  000000001021100000000000000000000000000050000010000000000000000000000000000PX
    DTL02SNM  SINOASIAN TRADING INTERNATIONAL LTD.
    DTL02SNA  OLIAJI TRADE CENTRE, 1ST FLOOR, VICTORIA MAHE, SEYCHELLES TEL: +248 4321 377
    DTL02CNM  PT ELANGPERDANA TYRE INDUSTRY
    DTL02CNA  NPWP:016386112436000 JALAN ELANG DESA SUKAHATI CITEUREUP BOGOR 16810, INDONESIA TEL:+62(21)8765105
    DTL02NNM  PT ELANGPERDANA TYRE INDUSTRY
    DTL02NNA  NPWP:016386112436000 JALAN ELANG DESA SUKAHATI CITEUREUP BOGOR 16810, INDONESIA TEL:+62(21)8765105
    DTL02SMR  NIL 
    DTL02HSC  2803
    DTL02DES  CARBON BLACK N330 PO NO. 18/04/PO/02547 DATED 4/26/2018 CFR JAKARTA, INDONESIA HS CODE:28030010 
    CNT010001TCNU9770332              40F  WHLB639733     
    CNT010001WHLU5405867              40F  WHLB639731     
    CNT010001WHLU5578013              40F  WHLB639732     
    CNT010001WHSU5102911              40F  WHLB639735     
    CNT010001WHSU5452632              40F  WHLB639734     
    DTL0101I00020000-- IRBNDIRBNDIDTPPIDTPPINTERASIA PROGRESS                                0548511603                    20180505                              20180529  000000000822600000000000000000000000000040000008000000000000000000000000000PX
    DTL02SNM  SINOASIAN TRADING INTERNATIONAL LTD.
    DTL02SNA  OLIAJI TRADE CENTRE, 1ST FLOOR, VICTORIA MAHE, SEYCHELLES TEL: +248 4321 377
    DTL02CNM  PT ELANGPERDANA TYRE INDUSTRY
    DTL02CNA  NPWP:016386112436000 JALAN ELANG DESA SUKAHATI CITEUREUP BOGOR 16810, INDONESIA
    DTL02NNM  PT ELANGPERDANA TYRE INDUSTRY
    DTL02NNA  NPWP:016386112436000 JALAN ELANG DESA SUKAHATI CITEUREUP BOGOR 16810, INDONESIA
    DTL02SMR  NIL 
    DTL02HSC  2803
    DTL02DES  80,000.00 KGS OF CARBON BLACK N330 CFR JAKARTA, INDONESIA PO NO. 18/04/PO/02547 DATED4/26/2018 HS CODE:28030010 
    
    CNT010002TCKU9697617              40F  WHLB639827     
    CNT010002TCNU4338347              40F  WHLB639829     
    CNT010002WHLU5419958              40F  WHLB639826     
    CNT010002WHLU5782449              40F  WHLB639828   
    

    如你所见, 每一行以唯一的代码开始。 基本上这些文件是父子格式

    parent is 'DTL01'
    child is 'DTL02', 'CNT01'
    

    步骤1,我将它们转换为基于这些txt文件名的数组。

    $file = new \SplFileObject($basePath . $this->master->baseName . '.' . $this->master->extension);
    

    结果是这样的:

    [
        0 => 'DTL0101I00010000-- IRBNDIRBNDIDTPPIDTPPINTERASIA PROGRESS                                0548511591                    20180505                              20180529  000000001021100000000000000000000000000050000010000000000000000000000000000PX'
        1 => 'DTL02SNM  SINOASIAN TRADING INTERNATIONAL LTD.'
        2 => 'DTL02SNA  OLIAJI TRADE CENTRE, 1ST FLOOR, VICTORIA MAHE, SEYCHELLES TEL: +248 4321 377'
        3 => 'DTL02CNM  PT ELANGPERDANA TYRE INDUSTRY'
        4 => 'DTL02CNA  NPWP:016386112436000 JALAN ELANG DESA SUKAHATI CITEUREUP BOGOR 16810, INDONESIA TEL:+62(21)8765105'
        5 => 'DTL02NNM  PT ELANGPERDANA TYRE INDUSTRY'
        6 => 'DTL02NNA  NPWP:016386112436000 JALAN ELANG DESA SUKAHATI CITEUREUP BOGOR 16810, INDONESIA TEL:+62(21)8765105'
        7 => 'DTL02SMR  NIL'
        8 => 'DTL02HSC  2803'
        9 => 'DTL02DES  CARBON BLACK N330 PO NO. 18/04/PO/02547 DATED 4/26/2018 CFR JAKARTA, INDONESIA HS CODE:28030010'
        10 => 'CNT010001TCNU9770332              40F  WHLB639733'
        11 => 'CNT010001WHLU5405867              40F  WHLB639731'
        12 => 'CNT010001WHLU5578013              40F  WHLB639732'
        13 => 'CNT010001WHSU5102911              40F  WHLB639735'
        14 => 'CNT010001WHSU5452632              40F  WHLB639734'
        15 => 'DTL0101I00020000-- IRBNDIRBNDIDTPPIDTPPINTERASIA PROGRESS                                0548511603                    20180505                              20180529  000000000822600000000000000000000000000040000008000000000000000000000000000PX'
        16 => 'DTL02SNM  SINOASIAN TRADING INTERNATIONAL LTD.'
        17 => 'DTL02SNA  OLIAJI TRADE CENTRE, 1ST FLOOR, VICTORIA MAHE, SEYCHELLES TEL: +248 4321 377'
        18 => 'DTL02CNM  PT ELANGPERDANA TYRE INDUSTRY'
        19 => 'DTL02CNA  NPWP:016386112436000 JALAN ELANG DESA SUKAHATI CITEUREUP BOGOR 16810, INDONESIA'
        20 => 'DTL02NNM  PT ELANGPERDANA TYRE INDUSTRY'
        21 => 'DTL02NNA  NPWP:016386112436000 JALAN ELANG DESA SUKAHATI CITEUREUP BOGOR 16810, INDONESIA'
        22 => 'DTL02SMR  NIL'
        23 => 'DTL02HSC  2803'
        24 => 'DTL02DES  80,000.00 KGS OF CARBON BLACK N330 CFR JAKARTA, INDONESIA PO NO. 18/04/PO/02547 DATED4/26/2018 HS CODE:28030010'
        25 => 'CNT010002TCKU9697617              40F  WHLB639827'
        26 => 'CNT010002TCNU4338347              40F  WHLB639829'
        27 => 'CNT010002WHLU5419958              40F  WHLB639826'
        28 => 'CNT010002WHLU5782449              40F  WHLB639828'
    ]
    

    我的目标是,根据每行的5个起始字符将它们分成子数组。

    如果字符串是= 'DTL01' ,我想将它们创建为一个子数组。这样地

    [
        0 => [
            'parent' => [
                'id' => {generateSomeUniqueTokenCode},
                'value' => $valueOf-DTL01
            ],
            'child' => [
                'parent_id' => $parent_id_above
                'DTL02' => [
                    '0' => [
                        'id' => {generateSomeUniqueTokenCode},
                        'value' => $valueOf-first-DTL02
                    ],
                    '1' => [
                        'id' => {generateSomeUniqueTokenCode},
                        'value' => $valueOf-second-DTL02
                    ],
                    ,
                    so on ...
                ],
                'CNT01' =>[
                    '0' => [
                        'id' => {generateSomeUniqueTokenCode},
                        'value' => $valueOf-first-CNT01
                    ],
                    '1' => [
                        'id' => {generateSomeUniqueTokenCode},
                        'value' => $valueOf-first-CNT01
                    ],
                ]
            ],
        ],
    
        so on for the next element....
    ]
    

    如您所见,这里有两个“dtl01”,因此数组必须有两个元素。 请告知。

    到目前为止,

    $tempArray = [];
    $parentId = 1;
    foreach ($array as $key => $sentences) {
    
        /** Get 5 Characters as a key * */
        $keyword = substr($sentences, 0, 5);
    
        /*
         * Create a variable to decide where is the parent
         * When found 'DTL01', create new subArray
         * */
        $index = ($keyword == 'DTL01') ? TRUE : FALSE;
    
        if ($index) {
            $tempArray[] = [
                'parent' => [
                    'id' => str_pad($parentId, 20, '0', STR_PAD_LEFT),
                    'value' => $sentences
                ],
                'child' => []
            ];
            $parentId++;
        } else {
            /*Still stuck*/
        }
    }
    

    结果:

    [
    0 => [
        'parent' => [
            'id' => '00000000000000000001'
            'value' => 'DTL0101I00010000-- IRBNDIRBNDIDTPPIDTPPINTERASIA PROGRESS                                0548511591                    20180505                              20180529  000000001021100000000000000000000000000050000010000000000000000000000000000PX'
        ]
        'child' => []
    ]
    1 => [
        'parent' => [
            'id' => '00000000000000000002'
            'value' => 'DTL0101I00020000-- IRBNDIRBNDIDTPPIDTPPINTERASIA PROGRESS                                0548511603                    20180505                              20180529  000000000822600000000000000000000000000040000008000000000000000000000000000PX'
        ]
        'child' => []
    ]
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   Yogendrasinh    7 年前

    希望这对你有帮助。

    $tempArray = [];
    $parentId = 1;
    $counter = 0;
    foreach ($array as $key => $sentences) {
        /*$tempSentences = '';
        $tempSentences = $sentences;*/
        //echo $sentences;echo '<br>';
    
        /** Get 5 Characters as a key * */
        $keyword = substr($sentences, 0, 5);
    
        /*
         * Create a variable to decide where is the parent
         * When found 'DTL01', create new subArray
         * */
        $index = ($keyword == 'DTL01') ? TRUE : FALSE;
    
        if ($index) {
            $tempArray[] = [
                'parent' => [
                    'id' => str_pad($parentId, 20, '0', STR_PAD_LEFT),
                    'value' => $sentences
                ],
                'child' => []
            ];
            if($parentId !=1){
                $counter++;
            }
            $parentId++;
        } else {
                $tempArray[$counter]['child'][] = $sentences;
        }
    }