使用控制字符读取PHP中的TXT文件

时间:2018-12-12 14:57:40

标签: php mysql

如何在PHP中读取以下TXT文件: example.txt

#字符是控制(分隔)字符,例如2846是打印机ID,以下数据是ID 2846的打印机参数。必须读取:

ID:2846

+ sn-> .1.3.6.1.4.1.367.3.2.1.2.1.4.0 = STRING:“已审查”

+ m-> .1.3.6.1.4.1.367.3.2.1.1.1.1.0 = STRING:“ Aficio MP 171”

+ s-> .1.3.6.1.4.1.367.3.2.1.1.1.2.0 = STRING:“ 1.03”

...等。+ sn,+ m等是打印机的参数。可以在@字符后读取座席的数据。 -字符是结束控制字符。然后,这些参数应保存在变量中,以便可以将其加载到mysql表中。

我尝试对脚本进行编程,但是我不知道如何读取文件。

<?php

$conn = mysqli_connect('localhost','root','','demo');
if(!$conn) die(mysqli_error());

$open = fopen('example.txt','r');
while (!feof($open)) {
    $getTextLine = fgets($open);

    /* reading txt file, separating values of control parameters of printer
        the code...
    */

    list($ID,$sn,$m,$s,...etc) = $explodeLine;
    $qry = "insert into agent_name (ID,sn,m,s,...etc) values('".$ID."','".$sn."','".$m."','".$s.",...etc')";
    mysqli_query($conn,$qry);
}

fclose($open);

?>

1 个答案:

答案 0 :(得分:1)

此例程将从文件中读取行并将其构建为行的数组,然后当它到达仅包含#的行时,它将处理数据。

对数据进行拆分,以便首先获取ID,然后依次选择标志的后几行和设置,并创建设置的关联数组。

$open = fopen('example.txt','r');
fgets($open); // Ignore first line
$entry = [];
while (!feof($open)) {
    $getTextLine = trim(fgets($open));

    if ( $getTextLine == '#' )  {
        // Take ID as first line
        $settings = ['ID' => array_shift($entry)];
        for ( $i = 0; $i < count($entry); $i+=2 )    {
            $settings[ltrim($entry[$i],"+")] = $entry[$i+1]??'';
        }

        print_r($settings);
        //     list($ID,$sn,$m,$s,...etc) = $explodeLine;
        //     $qry = "insert into agent_name (ID,sn,m,s,...etc) values('".$ID."','".$sn."','".$m."','".$s.",...etc')";
        //     mysqli_query($conn,$qry);
        $entry = [];
    }
    else    {
        $entry[] = $getTextLine;
    }
}

目前它会打印出数据,但是您应该能够将其插入数据库中。尽管我建议您研究准备好的语句,以确保没有引号或其他奇数引起SQL问题。

第一个条目的示例输出...

Array
(
    [ID] => 2846
    [sn] => .1.3.6.1.4.1.367.3.2.1.2.1.4.0 = STRING: "censored"
    [m] => .1.3.6.1.4.1.367.3.2.1.1.1.1.0 = STRING: "Aficio MP 171"
    [s] => .1.3.6.1.4.1.367.3.2.1.1.1.2.0 = STRING: "1.03"
    [ff] => .1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.1 = INTEGER: 254623
    [fffc] => .1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.23 = INTEGER: 746801
    [ffny] => .1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.6 = INTEGER: 230398
    [ffm] => .1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.19 = INTEGER: 19932
    [scff] => .1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.29 = INTEGER: 4476
    [scsz] => .1.3.6.1.4.1.367.3.2.1.2.19.5.1.9.28 = INTEGER: 3549
    [fb] => .1.3.6.1.4.1.367.3.2.1.2.24.1.1.5.1 = INTEGER: -3
)

更新的代码...

$open = fopen('example.txt','r');
fgets($open); // Ignore first line
$entry = [];
$all_settings = [];
while (!feof($open)) {
    $getTextLine = trim(fgets($open));

    if ( $getTextLine == '#' )  {
        // Take ID as first line
        $settings = ['ID' => array_shift($entry)];
        for ( $i = 0; $i < count($entry); $i+=2 )    {
            $settings[ltrim($entry[$i],"+")] = $entry[$i+1]??'';
        }

        $all_settings [] = $settings;
        $entry = [];
    }
    else    {
        $entry[] = $getTextLine;
    }
}

print_r($all_settings);