Как использовать PHP для чтения одной конкретной строки из текстового файла, который появляется после тега - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь прочитать данные из простого текстового файла по рецепту промышленной машины. Файл генерируется инструментом автоматически. Я хочу получить доступ к определенному параметру в определенном разделе файла.

Параметр называется «LightSrcRef_NominalGL». Проблема в том, что в файле есть несколько параметров, названных таковыми. Я специально хочу первый и единственный, который появляется после тега "[Scan2d]"

Обратите внимание, что нужный мне параметр не всегда отображается на одном и том же номере строки и [Scan2d] не всегда отображается в одном и том же месте, но мне нужен параметр в разделе Scan2d. Также представляется, что параметр LightSrcRef_NominalGL не всегда совпадает с количеством строк после [Scan2d].

Я надеялся прочитать файл построчно. Когда я добираюсь до [Scan2d], ​​устанавливаю флаг, затем, когда я добираюсь до параметра, устанавливаю мою переменную, затем выхожу.

Этого не происходит. Вместо этого он берет первый LightSrcRef_NominalGL в файле.

У нас есть похожие анализаторы рецептов, но это первый анализатор с такой уникальной структурой рецептов. Я искал способ прочитать файл по-другому, но ни один из них не дал других результатов.

Когда я печатаю фактическую строку, это показывает, что текстовый файл читает его построчно. Я не понимаю, почему он ведет себя не так, как ожидалось.

Вот пример текстового файла. В этом случае это в конце файла. В других будет другой раздел после. Мне пришлось добавить дополнительный возврат каретки в текстовом файле, потому что это не отображало их в виде отдельных строк. Они читаются в строках, потому что если у меня есть print $ line, он показывает ровно одну строку.

[Scan2d]

CameraTypeName = 2D

FocusPosAboveChuck = -2,59084174217116

Mag = 5

CameraName = HighMag

DifRingPos = 2

* * Гамма тысяча двадцать восемь = -1

LightSrcDif_ColorFilter = Gray

LightSrcDif_NominalGL = 0

LightSrcRef_ColorFilter = Cyan

LightSrcRef_NominalGL = 195,424629214628


$catcher = 0;  //used to verify the parameter only in scan2d section
                            $lines = file($dir.$default_directory."/".$current_recipe_file);

                            foreach($lines as $line)
                            {   $line_count ++;
                                if(preg_match("/[Scan2d]\b/i", $line))
                                {
                                    $catcher = $line_count; //used to only catch the parameter in the Scan2D section
                                }   
                                if(preg_match("/\bLightSrcRef_NominalGL=\b/i", $line))
                                {  
                                    $illumination_split_temp1 = preg_split("/\=/", $line);
                                    $recipe_illum = $illumination_split_temp1[1];

                                    if ($catcher >0) 
                                    {print $line . "   ". $catcher .  "<br>"; 
                                        $Tool_Ins150_Stats->Add_Recipe_Tag("Illumination Level", $recipe_illum);
                                        $catcher= 0;
                                        break;
                                    }   

                                }
                            } 

Он берет первый LightSrcRef_NominalGL в файле, а не тот, что после Scan2d.

Ответы [ 3 ]

1 голос
/ 25 июня 2019

Если искомые теги находятся в начале строк в файле, это можно сделать еще проще.Я немного изменил то, что у вас было, чтобы при обнаружении интересующего вас раздела foreach переходил к следующей записи.

$catcher = 0;
foreach($lines as $line) {
    if(preg_match("/[Scan2d]\b/i", $line)) {
        $catcher = 1;
        continue;
    }   
    if(preg_match("/\bLightSrcRef_NominalGL=\b/i", $line)) {  

        if (!$catcher) {
            continue;  // we haven't found the right section yet
        }
        $illumination_split_temp1 = preg_split("/\=/", $line);
        $recipe_illum = $illumination_split_temp1[1];
        print $line . "   ". $catcher .  "<br>"; 
        $Tool_Ins150_Stats->Add_Recipe_Tag("Illumination Level", $recipe_illum);
        $catcher= 0;
        break;
        }
}
0 голосов
/ 26 июня 2019

Образец, который вы предоставили, выглядит как файл в ini формате . Если это действительно так, есть очень простое решение, использующее функцию parse_ini_file

<?php

$values = parse_ini_file('sample.txt', true, INI_SCANNER_TYPED);
echo "The value is " . $values["Scan2d"]["LightSrcRef_NominalGL"] . "\n";

Я пытался против этого sample.txt файла

[test]
LightSrcRef_NominalGL=0

[Scan2d]
CameraTypeName=2D
FocusPosAboveChuck=-2.59084174217116
Mag=5
CameraName=HighMag
DifRingPos=2
Gamma=-1
LightSrcDif_ColorFilter=Gray
LightSrcDif_NominalGL=0
LightSrcRef_ColorFilter=Cyan
LightSrcRef_NominalGL=195.424629214628

[test2]
LightSrcRef_NominalGL=1

И результат:

The value is 195.42462921463

Конечно, это будет работать только в том случае, если весь ваш файл будет соответствовать формату ini, как в ваших примерах данных.

0 голосов
/ 26 июня 2019

    $lines = file($dir.$default_directory."/".$current_recipe_file);
    $catcher = 0;  //used to verify the parameter only in scan2d section
    foreach($lines as $line)
        {   
            if(preg_match("/\[Scan2d]/", $line))
            {
                $catcher = 1; //used to only catch the parameter in the Scan2D section
            }
            if (!$catcher)
            {   
                continue;  // haven't found the right one yet, skip the rest                
            }
            else 
            {   
                if(preg_match("/LightSrcRef_NominalGL=/", $line)) 
                {   
                    $illumination_split_temp1 = preg_split("/\=/", $line);
                    $recipe_illum = $illumination_split_temp1[1];
                    $Tool_Ins150_Stats->Add_Recipe_Tag("Illumination Level", $recipe_illum);
                    $catcher = 0; 
                    continue;
                }
            }   
        }

Это сработало, но большое спасибо Дейву, который определенно поставил меня на правильный путь !! Использование Else сработало, когда я до сих пор не до конца понимаю, почему выполнялся второй preg_match, если не был установлен $ catcher (и это не так, я его напечатал, чтобы быть уверенным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...