【问题标题】:Reading .txt files with PHP and store information into variables使用 PHP 读取 .txt 文件并将信息存储到变量中
【发布时间】:2013-04-23 20:07:08
【问题描述】:

我有两个需要阅读的.txt 文件。 两个文件的内容如下

log.txt

2013/04/20 01:08:11

数据.txt

MANUFACTURER: SISYSTEM
MODELNAME: DX1
BIRTHDATE: 19710108
SEX: M

对于 log.txt,我需要存储第一行的日期并将其保存到 mySQL 数据库中。

对于 data.txt,我需要将每一行的信息存储到变量中。即:

$manufacturer = SISYSTEM;
$modelname = DX1;
$birthdate =  19710108;
$sex = M;

对于 log.txt,我可以简单地使用 fget 读取第一行并将其存储到一个变量中。但是,对于 data.text,我无法弄清楚如何在循环中存储多个变量。到目前为止,这是我所拥有的,但我不知道每次通过 while 循环时如何将值分配给新变量。任何帮助表示赞赏!

<?PHP

$file_handle = fopen("data.txt", "r");

while (!feof($file_handle) ) {

   $line_of_text = fgets($file_handle);
   $parts = explode(':', trim($line_of_text) );


}

fclose($file_handle);

?>

【问题讨论】:

  • 使用csv文件函数fgetcsv()
  • $parts[] = explode(...)。那么 $parts 将是一个名称/值对的数组。
  • 你到底为什么要把它放在单独的变量中?您将不知道以后实际获取了什么...

标签: php text


【解决方案1】:

为什么需要在变量中使用它们?关联数组(“map”)是更简洁的方法

$result = array();
  // Your loop -->
  $parts = array_map('trim', explode(':', $line_of_text, 2)));
  $result[$parts[0]] = $parts[1];

【讨论】:

  • 只要添加逻辑来在脚本获取下一组数据时重置数组,假设不止一组。
  • @Robert 我希望我能理解你(看起来你是用智能手机写的?)我认为“这个文件中有多个记录”超出了这个问题的范围,因为我们另外需要知道,不同的记录是如何相互分离的。并且“可变变量”方法无论如何都会遇到同样的问题 :) 但是,第一行已经提到了如何重置结果结构:$result=array()
  • @KingCrunch 你能简单解释一下每行是如何工作的吗?特别是array_map?我如何调用这些变量来存储在 SQL 数据库中?
  • @alchuang 对 PHP 的一些基本了解可能很有用...$result 末尾是一个关联数组,因此您可以像往常一样检索值:$result['MODELNAME']
【解决方案2】:

使用变量变量:http://php.net/manual/en/language.variables.variable.php

在你的 while 循环中使用:

$line_of_text = fgets($file_handle);
$parts = explode(':', trim($line_of_text), 2);
${strtolower($parts[0])} = trim($parts[1]);

【讨论】:

  • data.txt:file_handle:哎呀!更好地检查“制造商”等。
  • @τεκ 已更改。 (限制爆炸)
【解决方案3】:

注意:我不知道如何将值分配给新变量

您可以使用arrays

我假设您刚刚提供了每个文件中的内容的示例 - 这些模式可能会重复。在我回答你的问题之前,我认为重要的是你应该知道在文本文件中维护数据是一个非常坏主意或很多原因。

以第二个文件为例,您有两种选择如何在 PHP 中管理这些数据 - 将您的数据视为一个表格:

manufctr  model   birthdate   sex
SISYSTEM  DX1     19710108    M
SISYSTEM  DX2     19710305    F
...

您可以将每一行存储在一个数组中,也可以将每一列存储在一个数组中。并且生成的数组集本身可以存储在数组中。

您如何加载和解析数据取决于数据结构的一致性(每个条目是否总是这种格式,或者它可能有额外/缺失的属性)。将数据读入行还是列取决于数据在文件中的存储方式以及您接下来打算对数据执行的操作。

$read=array();
while (true) {
   $record=array();
   for($x=0; $x<4; $x++) {
      $line_of_text = fgets($file_handle);
      list($k, $v) = explode(':', $line_of_text );
      $record[strtolower(trim($k))]=trim($v);
   }
   $read[]=$record;
   if (feof($file_handle) break;
}

【讨论】:

    【解决方案4】:

    while 循环中,您可以比较该行以查看您必须分配的变量:PHP: strcmp - Manual

    <?php
    $file_handle = fopen("data.txt", "r");
    
    while (!feof($file_handle) ) {
    
      $line_of_text = fgets($file_handle);
      $parts = explode(':', trim($line_of_text) );
      if (strcmp($parts[0], "MANUFACTURER")==0)
          $MANUFACTURER = trim($parts[1]);
      if (strcmp($parts[0], "MODELNAME")==0)
         $MODELNAME = trim($parts[1]);
      [...]
      else
         echo "I haven't recognised that: ".$parts[0];
    }
    
    fclose($file_handle);
    ?>
    

    也许你可以使用switch 声明

    <?php
    $file_handle = fopen("data.txt", "r");
    
    while (!feof($file_handle) ) {
    
      $line_of_text = fgets($file_handle);
      $parts = explode(':', trim($line_of_text) );
      switch($parts[0])
      case 'MANUFACTUREER':
          $manufactureer = $parts[1];
          break;
      case 'MODELNAME':
          $modelname = $parts[1];
          break;
      [...]
    }
    
    fclose($file_handle);
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      相关资源
      最近更新 更多