通过 .php 从文件中读取文本并将部分存储在变量中

read text from file via .php and store parts in variable

提问人:ejovrh2 提问时间:5/6/2020 更新时间:5/6/2020 访问量:1915

问:

问题是从文件中读取文本并准备特定文本并将其保存到变量中以插入到数据库中。像这里这样的东西:https://www.wdb24.com/php-read-text-file-and-insert-into-mysql-database/

测量/导入数据如下所示:

    1=19-10-18 10:02:06
    2=+1.313026E+00 l/s 
    3=+1.671796E-01m/s
    4=+1.500691E+02m3 
    5=+1.501138E+02m3 
    6=+0.000000E+00m3 
    1=19-10-18 10:03:06
    2=+1.266786E+00 l/s 
    3=+1.612923E-01m/s
    4=+1.501403E+02m3 
    5=+1.501850E+02m3 
    6=+0.000000E+00m3 
    1=19-10-18 10:04:06
    2=+1.597391E+00 l/s 
    3=+2.033861E-01m/s
    4=+1.502291E+02m3 
    5=+1.502738E+02m3 
    6=+0.000000E+00m3
     .
     .
     . 

始终只有前三行 (1=...2=...3=...)从六个重复的行需要存储在变量中,例如 $first、$second$third。 也许像数组一样,因为我需要将文本数据保存在数据库的一个字段中

$first=19-10-18 10:02:06,19-10-18 10:03:06,19-10-18 10:04:06 //从 1=

$second=+1.313026E+00,+2.333026E+00,+2.123026E+00 //起 2=

$third=+1.671796E-01,1.87794E-01,1.34146E-01 //从 3=

我有一小部分代码,请有人帮助准备数据(插入数据库没有问题)。

    <?php

$file=fopen("test_file/test.txt", "r");

while(!feof($file)){

    $content=fgets($file);
    $content=explode(PHP_EOL,$content);  //break line?
    //list($first,$second,$third,$four,$five,$six)=$content;
    var_dump ($content); //result is some strange array, can't call $content[0] in some loop...


}


fclose($file);

?>

结果是一些看起来很奇怪的arrray吗? 我是php初学者,提前感谢您的任何建议,链接...

如果您想知道最终产品是什么,那么从数据库中读取数据的 google chart 就是。我认为每个测量都有表格是不方便的,计划是将其存储在以下位置:

编号 |时间戳 |值1 |价值观2

1 |多次 |many值 |manyValues

2 ............

因此,在这种情况下,只有一个具有许多测量值的 tabel 。

PHP 文本 feof

评论

1赞 droopsnoot 5/6/2020
你的 “explode()” 调用不会有太大好处,因为你是用 “end of line” 字符拆分一行文本,所以它实际上并没有改变任何东西。如果改用“=”来分解它会发生什么?这应该给出一个双元素数组,你的代码只需要检查第一个元素的值,看看如何处理第二个元素。
1赞 droopsnoot 5/6/2020
如果您认为在单个数据库列中存储多个值是个好主意,则应该重新考虑这个想法,因为它通常不是。
0赞 CBroe 5/6/2020
我将从这里 php.net/manual/en/function.file.php 开始,它可以快速将各个行放入一个数组中,然后您可以简单地循环。我可能会使用循环,并每次增加循环计数器。然后,您可以使用当前循环索引、当前循环索引加 1 和当前循环索引加 2 直接访问您感兴趣的行中的值。for6
0赞 CBroe 5/6/2020
顺便说一句,这与你去年 11 月问的问题有何不同?stackoverflow.com/questions/58727560/......你在那里得到的答复应该已经能够帮助你继续前进了,那么你为什么现在又问了呢?
0赞 ejovrh2 5/6/2020
@CBroe,这是我几个月前开始学习一些新事物的项目。我完全忘记了我问了这个问题

答:

3赞 Random Dude 5/6/2020 #1

您的代码将如下所示:

<?php

$handle = fopen("inputfile.txt", "r");
$lineVariables = [];
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        $tmp = explode('=', $line);
        $lineVariables[trim($tmp[0])][] = trim($tmp[1]);
    }
    fclose($handle);

    $result = [];
    foreach ($lineVariables as $key => $variable) {
        $result[$key] = implode(', ', $variable);
    }

    echo '<pre>' . print_r($result, true) . '</pre>';
} else {
    // error opening the file.
}

输出:

Array
(
    [1] => 19-10-18 10:02:06, 19-10-18 10:03:06, 19-10-18 10:04:06
    [2] => +1.313026E+00 l/s, +1.266786E+00 l/s, +1.597391E+00 l/s
    [3] => +1.671796E-01m/s, +1.612923E-01m/s, +2.033861E-01m/s
    [4] => +1.500691E+02m3, +1.501403E+02m3, +1.502291E+02m3
    [5] => +1.501138E+02m3, +1.501850E+02m3, +1.502738E+02m3
    [6] => +0.000000E+00m3, +0.000000E+00m3, +0.000000E+00m3
)

解释

在 while 循环中,您阅读以下行:

$line = fgets($handle)

然后,您需要处理这些行。由于变量的索引是与要添加到行中的行变量分开的第一个字符,因此可以使用使用“=”字符作为分隔符的分解函数。

然后在 $tmp 数组中,您将有 2 个元素: 将包含结果的索引。并将包含该行的其余部分。$tmp[0]$tmp[1]

例如,第一行:

$tmp[0] // contains 1
$tmp[1] // contains 19-10-18 10:02:06

在 while 循环之后,我们的将如下所示:$lineVariables

Array
(
[1] => Array
    (
        [0] => 19-10-18 10:02:06
        [1] => 19-10-18 10:03:06
        [2] => 19-10-18 10:04:06
    )

[2] => Array
    (
        [0] => +1.313026E+00 l/s
        [1] => +1.266786E+00 l/s
        [2] => +1.597391E+00 l/s
    )

[3] => Array
    (
        [0] => +1.671796E-01m/s
        [1] => +1.612923E-01m/s
        [2] => +2.033861E-01m/s
    )

[4] => Array
    (
        [0] => +1.500691E+02m3
        [1] => +1.501403E+02m3
        [2] => +1.502291E+02m3
    )

[5] => Array
    (
        [0] => +1.501138E+02m3
        [1] => +1.501850E+02m3
        [2] => +1.502738E+02m3
    )

[6] => Array
    (
        [0] => +0.000000E+00m3
        [1] => +0.000000E+00m3
        [2] => +0.000000E+00m3
    )

)

现在,您可以关闭文件并专注于将结果格式化为所需的外观。我们将结果存储在变量中,该变量是一个数组,数组的一个元素将表示一个所需的结果,数组上的索引将是对行的第一个数字字符的引用。$result

要为每一行附加 的元素,我们可以使用内爆函数,这与爆炸函数相反。对于一个单曲,这将转换以下内容:$lineVariable

Array
    (
        [0] => 19-10-18 10:02:06
        [1] => 19-10-18 10:03:06
        [2] => 19-10-18 10:04:06
    )

进入这一行字符串:

19-10-18 10:02:06, 19-10-18 10:03:06, 19-10-18 10:04:06

因此,我们只需完成准备并处理元素以达到所需的格式即可。$lineVariables

就是这样。

评论

0赞 Nico Haase 5/6/2020
为什么会是这个样子?请分享一些解释,以便其他人可以从中学习
0赞 Random Dude 5/6/2020
添加了一些解释。如果还有其他问题,我可以扩展它。
0赞 ejovrh2 5/6/2020
@DavidHlavati,非常感谢,它有效。需要多研究一下你的代码。