遍历txt文件以使用字符串的特定部分

时间:2018-06-26 06:10:08

标签: php

我是Php的新手,无论我用多少谷歌搜索,似乎都无法弄清楚。

因此,我打开了txt文件(该文件由多行这种类型的字符串唯一标识符IMEI以粗体显示: Rx:00:39:54 06/09/2015:+ RESP:GTEPS,210101, 863286020022449 ,, 8296,01,1,3,0.0,0,1031.1,29.367950,-30.799161,20150906003710 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、。。。。

我的问题是,如何提取/仅使用具有相同唯一标识符的字符串,然后遍历那些字符串以在另一个函数中使用? 我的函数具有不同的大小写,并且每种情况都有不同的计算,因此,为了在我的函数中使用以下字符串,我需要遍历txt文件(例如863286020022449作为标识符,忽略其他标识符/ IMEI):

这是我的入门功能:

function GetParam($unknownFunction, $numberCommas) {
$returnString = "";
$foundSting = 0;
$numberFound = 0;
$len = strlen($unknownFunction);
for ($i = 0; $i < $len; ++$i) {
if ($Rawline[$i] == ",") {
++$numberFound;
if ($numberFound > $numberCommas)
break;
if ($numberFound == $numberCommas)
$foundSting = 1;
}
else if ($foundSting == 1) {
$returnString .= $unknownFunction[$i];
}
}
return $returnString;
echo $returnString;
}

$i = strpos($unknownFunction, ":GT");
$p = substr($unknownFunction, $i+3,3);

$Protocol = GetParam($unknownFunction, 1);

//此开关读取消息类型的差异(例如,HBD,在这种情况下是心跳消息类型,因此字符串中的逗号数量不同,并且逗号中字符的定义不同)    切换($ p){       案例“ HBD”:          // + ACK:GTHBD,220100,135790246811220,,20100214093254,11F0 $          //这是HBD消息的示例

     $result2["Type"] = 'Heart beat';
     $IMEI = GetParam($unknownFunction, 2); 
     $mDate = GetParam($unknownFunction, 4);
     $mDate = substr($mDate,0,4).'-'.substr($mDate,4,2).'- 
     '.substr($mDate,6,2).' 
     '.substr($mDate,8,2).':'.substr($mDate,10,2).':'.substr($mDate,12,2);
     break;

这是我目前面临的最大问题,当我打印不同的行时,它指示正确的IMEI,但它不会遍历整个文件以使用属于该IMEI的每个字符串。

您的协助将不胜感激。 非常感谢。

输入文件示例:

Rx:00:00:00 28/02/2018:+RESP:GTFRI,3C0103,862045030241360,,14067,11,1,1,29.7,320,151.1,30.949307,-29.819685,20180227235959,0655,0001,013A,87B6,00,35484.1,01500:51:31,,,100,220101,,,,20180228000000,3461$
Rx:00:00:01 28/02/2018:+RESP:GTERI,380201,869606020047340,gv65,00000002,14076,10,1,1,119.0,119,24.3,18.668516,-34.016808,20180227235955,0655,0001,00F7,2DC9,00,98912.0,02235:20:25,0,100,220101,0,0,20180227235958,FF20$
Rx:00:00:03 28/02/2018:+RESP:GTERI,380201,869606020162990,,00000002,12912,10,1,1,0.0,230,1127.3,30.846671,-27.674206,20180227235956,0655,0001,013E,88B0,00,106651.1,03546:44:42,0,100,210101,0,0,20180227235959,6190$
Rx:00:00:03 28/02/2018:+ACK:GTHBD,450102,865084030005340,gb100,20180228000003,CC61$
Rx:00:00:03 28/02/2018:+RESP:GTERI,380201,869606020115980,,00000002,13640,10,1,1,12.1,353,1663.1,28.580726,-28.162208,20180227235957,,,,,,37599.6,02422:07:24,0,100,220101,0,0,20180228000000,1937$
Rx:00:00:04 28/02/2018:+RESP:GTERI,380502,869606020276840,gv65,00000002,12723,10,1,1,0.0,106,1232.8,22.878013,-27.951762,20180227235952,0655,0001,0204,63C5,00,13808.9,00778:32:20,0,100,210100,0,0,20180228000002,2C50$
Rx:00:00:04 28/02/2018:+RESP:GTERI,380502,869606020274530,gv65,00000002,12683,10,1,1,0.0,91,1213.7,24.863444,-28.174319,20180227235956,0655,0001,0203,69F1,00,9753.2,00673:49:21,0,100,210100,0,0,20180228000003,8AC7$
Rx:00:00:05 28/02/2018:+ACK:GTHBD,380201,863286023083810,,20180228000003,0D87$
Rx:00:00:06 28/02/2018:+RESP:GTFRI,3C0103,862045030241360,,14086,10,1,1,34.0,327,152.0,30.949152,-29.819501,20180228000002,0655,0001,013A,87B6,00,35484.1,01500:51:36,,,100,220101,,,,20180228000005,3462$
Rx:00:00:06 28/02/2018:+ACK:GTHBD,060228,862894021626380,,20180228000007,F9A5$
Rx:00:00:07 28/02/2018:+RESP:GTERI,380201,869606020019430,,00000002,12653,10,1,1,0.0,219,1338.7,26.882063,-28.138099,20180228000002,,,,,,86473.7,05645:48:34,0,93,210101,0,0,20180228000003,0FA5$
Rx:00:00:09 28/02/2018:+ACK:GTHBD,380502,869606020233940,gv65,20180228000008,7416$
Rx:00:00:10 28/02/2018:+RESP:GTAIS,380201,869606020171710,,11,11,1,1,0.0,95,281.2,30.855164,-29.896575,20180228000009,0655,0001,0156,9A9F,00,156073.7,20180228000008,F9A4$

每条GT消息都具有某种含义,这就是为什么我只需要提取一个特定的IMEI并将结果用于我的函数的原因,以细分逗号之间每组数字的实际含义。最终结果需要在excel电子表格中填充,但这是另一个问题。

3 个答案:

答案 0 :(得分:0)

嵌套foreach,跟踪您已经经历的IMEI。或类似的东西。

<?php

 $filename = 'info.txt';
 $contents = file($filename);

 foreach ($contents as $line) {

     $doneAlreadyArray = array();
     $IMEI = GetParam($line, 2); 

     foreach ($contents as $IMEIline){

         $thisIMEI = GetParam($IMEIline,2);

         //check if already done the IMEI previously
         if (!in_array($thisIMEI, $doneAlreadyArray)){
             //matching IMEIs?
             if ($thisIMEI == $IMEI){ 
                 //run new function with entire $IMEIline
                 new_function($IMEIline);
              }
          }
      }

      //add IMEI to doneAlreadyArray
      array_push($doneAlreadyArray,$IMEI); 
 } 

 ?>

答案 1 :(得分:0)

如果我对您的问题的理解正确,并且您想使用相同的唯一标识符提取字符串(行),那么这对于满足您的需求可能很有用。 该示例非常基础,并使用您问题中的数据:

<?php
// Read the file.
$filename = 'input.txt';
$file = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

// Each item of $output will contain an array of lines:
$output = array();
foreach ($file as $row) {
    $a = explode(',', $row);
    $imei = $a[2];
    if (!array_key_exists($imei, $output)) {
        $output[$imei] = array();
    }
    $output[$imei][] = $row;
}

// Then do what you want ...
foreach ($output as $key=>$value) {
    echo 'IMEI: '.$key.'</br>';
    foreach($value as $row) {
        // Here you can call your functions. I just echo the row:
        echo $row.'</br>';
    }

}
?>

答案 2 :(得分:0)

感谢您的反馈。 Ryan Dewberry最终帮助了我。 修复比我想象的还要简单:)

//Unknownfunction is now $line

function GetParam($line, $numberCommas) {
$returnString = "";
$foundSting = 0;
$numberFound = 0;
$len = strlen($line);
for ($i = 0; $i < $len; ++$i) {
      if ($line[$i] == ",") {
            ++$numberFound;
            if ($numberFound > $numberCommas)
                  break;
            if ($numberFound == $numberCommas)
                  $foundSting = 1;
      }
      else if ($foundSting == 1) {
            $returnString .= $line[$i];
      }
}
return $returnString;
// print $returnString;
}
//this is new - makes sure I use the correct IMEI
$contents = file($fileName);

foreach ($contents as $line){

$haveData = 0;
$IMEI = GetParam($line, 2); 

if ($IMEI == $gprsid){

$i = strpos($line, ":GT");
$p = substr($line, $i+3,3);
$Protocol = GetParam($line, 1);

//this is the part I struggled with as well - This is an array of all of my 
//calculation 
//results and in printing it out I can see that everything is working

$superResult = array();

  array_push($superResult,$result2);

print_r($superResult);

}
}

非常感谢。谢谢!