【问题标题】:php select specific content from input file to put in array elementsphp 从输入文件中选择特定内容以放入数组元素
【发布时间】:2011-03-04 20:13:31
【问题描述】:

我有一个输入文件(从下面显示的文件中提取),其中包含多行,我需要从中选择特定文本并将每个选择放入一个数组元素中:

从输入文件中执行:

"BLOCK","PARTNO"

"ELEMENT","HEADER-"

"NAME","1AB000072186"

"REVISION","0000"

"PARTSHAPE","RECT_074_044_030"

"PACKAGE","120830E"

"PMABAR",""

"PARTCOMMENT","CAP-TANT*150uF*20%*10V7343*4.3mm"

"ELEMENT","PRTIDDT-"

"PMAPP",1

"PMADC",2

"ComponentQty",2

"BLOCK","PARTNO"

"ELEMENT","HEADER-"

"NAME","1AB030430005"

"REVISION","0000"

"PARTSHAPE","RECT_072_042_030"

"PACKAGE","120830E"

"PMABAR",""

"PARTCOMMENT","1.0000 Amp SUBMINIATURE FUSE"

"ELEMENT","PRTIDDT-"

"PMAPP",2

"PMADC",0

"ComponentQty",1

"BLOCK","PARTNO"

"ELEMENT","HEADER-"

"NAME","1AB030430001"

"REVISION","0000"

"PARTSHAPE","RECT_072_042_030"

"PACKAGE","120830E"

"PMABAR",""

"PARTCOMMENT","2.0000 Amp SUBMINIATURE FUSE"

"ELEMENT","PRTIDDT-"

"PMAPP",2

"PMADC",0

"ComponentQty",1

请注意,在每次出现带有短语“ComponentQty”的行后,内容开始重复...

我需要在数组元素的一维中出现“NAME”旁边的 PartNumber 以及在每个元素的第二维中出现“PARTSHAPE”旁边的内容。不过,我对如何做到这一点感到非常困惑……请帮忙!!!

【问题讨论】:

    标签: php input multidimensional-array text-parsing


    【解决方案1】:
    $fh = fopen('yourfile.txt', 'rb');
    
    $found_stuff = array();
    $last_component = null;
    
    while($line = fgets($fh)) { // read a line
       $parts = explode(',', $line);  // split into components
       switch($parts[0]) {  // based on which key we're on
           case '"NAME"':
                $last_component = $parts[1];   // save the key's value
                break;
           case '"PARTSHAPE"':
                $found_stuff[$last_component] = $parts[1];  // store the partshape name
                break;
       }
    }
    fclose($fh);
    

    这应该完成基本工作。读一行,把它分解成逗号出现的片段。第一部分是“键”,第二部分是值。然后继续阅读,直到我们点击 NAME 或 PARTSHAPE 键,然后根据需要存储值。

    请注意,我没有从值中去掉双引号。这留给读者作为练习。此代码还假定文件的格式是常规的,并且“NAME”将显示在任何 PARTSHAPE 行之前,并且 NAME/PARTSHAPE 行之间将有完美的 1:1 交替。如果您连续获得两个 PARTSHAPES,您将失去第一个。如果在遇到第一个 NAME 之前出现 PARTSHAPE,那么你也会失去那个。

    【讨论】:

    • 在我添加该代码并尝试执行我的 shell 之后,我的 shell 只是挂起并且不显示任何像它仍在处理中的东西。
    • 奇数。也许让它在运行时吐出一些调试信息 - 例如,它找到的名称/零件形状。
    • 我在 switch 语句的右括号后放置了一个 echo $parts[0],它以“UNITUNITUNITUNIT”回复,就像一百万次一样。
    • 那么最好看一下文件。听起来这并不是你想的那样。该代码中没有任何内容会导致无限循环,但如果该文件在更远的地方有不同的结构,那么它看起来就像被冻结了。
    【解决方案2】:

    以下步骤对我有用:

    粘贴在我的 OP 中的部分(重复多次)定义为 $PartNoContents $BlockData[] 是我需要将 $PartNoContents 中的选择粘贴到的数组。

    $PartNoContents = str_replace('"', '', $PartNoContents);
    $PartLines = explode("\n", $PartNoContents);
    $PartData = array();
    foreach ($PartLines as $PartLine){
        $PartData[] = explode(',', $PartLine);
    }
    
    for($p=0;$p<count($PartLines);$p++){
       if ( isset( $PartData[$p][1] ) && !empty( $PartData[$p][1] ) ){
           $p1 = str_replace(chr(13), '', $PartData[$p][1]);
           if ( isset($BlockData[$b][0]) && !empty($BlockData[$b][0]) && $BlockData[$b][7]==$p1 ){
               $BlockData[$b][13] = str_replace(chr(13), '', $PartData[$p+$PartDataIncNum][1]);
               $p = count($PartLines) ;
           }
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      相关资源
      最近更新 更多