如何使用php从标记后出现的文本文件中读取特定行
我试图从工业机器配方的纯文本文件中读取数据。该文件由该工具自动生成。我想访问文件特定部分中的特定参数 该参数称为“LightSrcRef_NominalGL”。问题是,文件中有一些这样命名的参数。我特别想要在标记“[Scan2d]”之后出现的第一个,也是唯一的一个 请注意,我需要的参数并不总是显示在相同的行号上,[Scan2d]也不总是显示在相同的位置,但我需要在Scan2d部分中显示该参数。此外,LightSrcRef_NominalGL参数在[Scan2d]之后的行数并不总是相同的 我所希望的是逐行阅读文件。当我到达[Scan2d]时,设置一个标志,然后当我到达参数时,设置我的变量,然后退出 这并没有发生。相反,它采用文件中的第一个LightSrcRef_NominalGL 我们有类似的配方分析器,但这是第一个具有这种独特配方结构的分析器。我一直在寻找一种以不同方式读取文件的方法,但没有一种方法产生不同的结果 当我打印实际行时,它显示文本文件正在逐行读取它。我不明白为什么它的行为不符合预期 下面是文本文件的示例。在本例中,它位于文件的末尾。在其他部分中,后面将有另一部分。我不得不在文本文件中添加一个额外的回车符,因为它没有将它们显示为单独的行。它们被逐行读取,因为如果我让它打印$line,它只显示一行 [Scan2d] CameraTypeName=2D FocusPosAboveChuck=-2.59084174217116 Mag=5 CameraName=HighMag DifRingPos=2 伽马=-1 LightSrcDif_颜色过滤器=灰色 LightSrcDif_NominalGL=0 LightSrcRef_颜色过滤器=青色 LightSrcRef_NominalGL=195.424629214628如何使用php从标记后出现的文本文件中读取特定行,php,text-files,Php,Text Files,我试图从工业机器配方的纯文本文件中读取数据。该文件由该工具自动生成。我想访问文件特定部分中的特定参数 该参数称为“LightSrcRef_NominalGL”。问题是,文件中有一些这样命名的参数。我特别想要在标记“[Scan2d]”之后出现的第一个,也是唯一的一个 请注意,我需要的参数并不总是显示在相同的行号上,[Scan2d]也不总是显示在相同的位置,但我需要在Scan2d部分中显示该参数。此外,LightSrcRef_NominalGL参数在[Scan2d]之后的行数并不总是相同的 我所希望
$catcher=0//仅用于在scan2d部分中验证参数
$lines=file($dir.$default\u directory.“/”$current\u recipe\u file);
foreach($line作为$line)
{$line_count++;
如果(预匹配(“/[Scan2d]\b/i”,$line))
{
$catcher=$line\u count;//用于仅捕获Scan2D节中的参数
}
if(preg_match(“/\brythref_NominalGL=\b/i”,$line))
{
$illumination\u split\u temp1=preg\u split(“/\=/”,$line);
$recipe_illum=$illumination_split_temp1[1];
如果($catcher>0)
{打印$line.“$catcher.”
“;
$Tool_Ins150_Stats->Add_Recipe_标签(“照明度”,$Recipe_illum);
$catcher=0;
打破
}
}
}
它采用的是文件中的第一个LightSrcRef_NominalGL,而不是Scan2d之后的LightSrcRef_NominalGL。如果您要查找的标记位于文件中行的开头,则可以简化此操作。我稍微更改了您所拥有的内容,以便在找到您感兴趣的部分时,
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;
}
}
$catcher=0;
foreach($line作为$line){
如果(预匹配(“/[Scan2d]\b/i”,$line)){
$catcher=1;
继续;
}
如果(preg_match(“/\b/srcref_NominalGL=\b/i”,$line)){
如果(!$catcher){
continue;//我们还没有找到正确的部分
}
$illumination\u split\u temp1=preg\u split(“/\=/”,$line);
$recipe_illum=$illumination_split_temp1[1];
打印$line.“$catcher.”
“;
$Tool_Ins150_Stats->Add_Recipe_标签(“照明度”,$Recipe_illum);
$catcher=0;
打破
}
}
$lines=file($dir.$default\u directory.“/”$current\u recipe\u file);
$catcher=0//仅用于在scan2d部分中验证参数
foreach($line作为$line)
{
如果(预匹配(“/\[Scan2d]/”,$line))
{
$catcher=1;//用于仅捕获Scan2D节中的参数
}
如果(!$catcher)
{
继续;//尚未找到正确的,跳过其余部分
}
其他的
{
if(preg_match(“/LightSrcRef_NominalGL=/”,$line))
{
$illumination\u split\u temp1=preg\u split(“/\=/”,$line);
$recipe_illum=$illumination_split_temp1[1];
$Tool_Ins150_Stats->Add_Recipe_标签(“照明度”,$Recipe_illum);
$catcher=0;
继续;
}
}
}
这很管用,但非常感谢戴夫,他让我走上了正确的道路!!当我仍然不完全理解为什么在未设置$catcher的情况下执行第二个preg_匹配时,Else的使用起到了作用(当然,我打印了它)。您提供的示例似乎是其中的一个文件。如果真的是这样,有一个非常简单的解决方案,使用
如果您希望获得更多帮助以更好地显示文本文件的某些部分和预期输出,请在preg_match
时使用捕获组。这不会返回任何结果。print语句从不执行。我希望这种逻辑能够起作用,因为它与我试图实现的目标类似。谢谢你的回答。好的,工作
[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