我正在尝试从一个工业机器配方的纯文本文件中读取数据。该文件由该工具自动生成。我想要访问文件的特定部分中的特定参数。
这个参数被称为"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
$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之后的那个。
发布于 2019-06-26 03:24:27
如果您要查找的标记位于文件中各行的开头,则可以使此操作更简单。我稍微更改了您的内容,以便当找到您感兴趣的部分时,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;
}
}
发布于 2019-06-26 09:45:16
$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的使用仍然起作用(为了确保没有设置,我打印了它)。
发布于 2019-06-26 10:24:20
您提供的示例似乎是ini
format格式的文件。如果确实如此,则有一个使用parse_ini_file
function的非常简单的解决方案
<?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
格式时,这才能起作用。
https://stackoverflow.com/questions/56760481
复制相似问题