首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用php从出现在标记后面的文本文件中读取特定行

如何使用php从出现在标记后面的文本文件中读取特定行
EN

Stack Overflow用户
提问于 2019-06-26 03:00:13
回答 3查看 61关注 0票数 1

我正在尝试从一个工业机器配方的纯文本文件中读取数据。该文件由该工具自动生成。我想要访问文件的特定部分中的特定参数。

这个参数被称为"LightSrcRef_NominalGL“,问题是在文件中有一些这样命名的参数。我特别想要出现在标签"Scan2d“之后的第一个,并且只有一个。

注意,我需要的参数并不总是显示在相同的行号上,Scan2d也不总是显示在相同的位置,但我需要在Scan2d部分中显示该参数。在Scan2d之后,LightSrcRef_NominalGL参数似乎并不总是相同的行数。

我所希望的是逐行阅读文件。当我到达Scan2d时,设置一个标志,然后当我到达参数时,设置我的变量,然后退出。

这没发生过。相反,它将获取文件中的第一个LightSrcRef_NominalGL。

我们有类似的食谱分析器,但这是第一个具有这种独特食谱结构的。我一直在寻找一种方法来以不同的方式读取文件,但没有一种方法产生不同的结果。

当我打印实际的行时,它显示文本文件正在逐行读取它。我不明白为什么它的表现不像预期的那样。

下面是文本文件示例。在这种情况下,它位于文件的末尾。在其他情况下,后面会有另一个部分。我必须在文本文件中添加额外的回车,因为这不会将它们显示为单独的行。它们是逐行读取的,因为如果我让它打印$line,它只显示一行。

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

代码语言:javascript
复制
$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之后的那个。

EN

回答 3

Stack Overflow用户

发布于 2019-06-26 03:24:27

如果您要查找的标记位于文件中各行的开头,则可以使此操作更简单。我稍微更改了您的内容,以便当找到您感兴趣的部分时,foreach将转到下一个记录。

代码语言:javascript
复制
$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;
        }
}
票数 1
EN

Stack Overflow用户

发布于 2019-06-26 09:45:16

代码语言:javascript
复制
    $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;
                }
            }   
        }

这起作用了,但非常感谢Dave,他确实让我走上了正确的道路!当我仍然不能完全理解在没有设置$catcher的情况下为什么要执行第二个preg_match时,Else的使用仍然起作用(为了确保没有设置,我打印了它)。

票数 0
EN

Stack Overflow用户

发布于 2019-06-26 10:24:20

您提供的示例似乎是ini format格式的文件。如果确实如此,则有一个使用parse_ini_file function的非常简单的解决方案

代码语言:javascript
复制
<?php

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

我尝试使用这个sample.txt文件

代码语言:javascript
复制
[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

结果是:

代码语言:javascript
复制
The value is 195.42462921463

当然,只有当您的整个文件都像在示例数据中那样遵守ini格式时,这才能起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56760481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档