解析平面文件

时间:2010-01-12 06:58:18

标签: php

假设我想使用php读取文本文件。

现在我的文本文件包含

User=Test
Age=18
Gender=F

User=Test2
Age=34
Gender=M

并且跟着这样。

现在假设我想使用php来读取文本文件,只找到User =的值并显示它。

实现这一目标的最简单方法是什么?

谢谢。

7 个答案:

答案 0 :(得分:4)

这可能比您正在寻找的更多,但如果您要解析文本文件 并且你没有依赖于特定格式,你应该使用php内置支持的格式。对我来说,最明显的两个选项是XML和JSON。恕我直言JSON可能是最简单的。

在您的示例中,数据文件可能如下所示

[
  {
     'User':'Test',
     'Age':18,
     'Gender':'F'
  },
  {
     'User':'Test2',
     'Age':34,
     'Gender':'M'
  }
]

从中读取的php将是

contents = file_get_contents($filename); 
$contents = utf8_encode($contents);
$m = json_decode($contents);

现在你可以像使用任何数组一样使用$ m

foreach( $m as $user )
{
   print $user->User . "\n";
}

答案 1 :(得分:1)

除非您正在寻找特定值,否则您基本上必须将整个文件读入内存。您可以逐行阅读并输出以“User”开头的任何行,如下所示:

$fp = fopen("test_input.txt","r");
while(! feof($fp)) {
    $line = fgets($fp);
    if (substr($line,0,5) == "User=") echo substr($line,5);
}
fclose($fp);

如果您希望以更有用的形式提供信息,可以将其分解为一组用户。假设文件的每个“部分”都用双换行符分隔,你可以这样做:

$out = array();
$contents = file_get_contents('test_input.txt');
$blocks = explode("\n\n",$contents);
foreach($blocks as $b)
{
    $user = array();
    $lines = explode("\n",$b);
    foreach($lines as $line) {
        list($key,$value) = explode("=",$line,2);
        $user[$key] = $value;
    }
    $out[] = $user;
}

//now have an array of user info
foreach($out as $i) echo $i['User'];

显然,这会假设你的数据(例如用“\ n”字符分隔的所有行),但你明白了。

答案 2 :(得分:1)

$filename = "users.txt";

$user_file_array = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

//Now you have an array of each line of the file.

foreach($user_file_array as $user_info) {
     if(strpos($user_info, "User=") !== false) {
           $users[] = str_replace("User=", "", $user_info);
      }
}

以上假设每一行信息都在一个新行上,User=区分大小写,并且您可以循环遍历整个文件。您将获得一个仅返回User=右侧用户名的数组。

如果您希望在列中回显它,请更改$ users数组构建的位,或者将其添加到结尾:

 echo implode("\n" $users);

答案 3 :(得分:0)

您可以尝试fgets()获取文件的一行,并将开头的子字符串测试它是否以正确的文本开头。可能有更简单的方法。

答案 4 :(得分:0)

请输入此代码

<?php 
$file = "test.txt";
$userArr=array();
$f = fopen($file, "r");
while ( $line = fgets($f) ) 
{
    $lineArr = explode('=',$line);

    if($lineArr[0]=='User')
    {
        echo "User Name: ".$lineArr[1];
        echo "<br/>";
            $userArr[] = $lineArr[1];
    }

}

print_r($userArr);
?>

了解更多信息请点击here

答案 5 :(得分:0)

<?php
$lines = array();
$file = fopen("sample.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
$i = 0;
while(!feof($file))
  {
  $i++;
  $lines[$i] = fgets($file). "<br />";
  }
fclose($file);

$matches = preg_grep("/^User=(.*)/", $lines);


print_r($matches);
?>

取自http://php.net/manual/en/function.preg-grep.phphttp://www.phpfreaks.com/forums/index.php?topic=213127.0

答案 6 :(得分:0)

如果您与您描述的格式结婚/坚持,那么您可以在下面试用我的代码。它会给你一个很好的数组,你可以轻松地使用它。否则,我建议您使用Michael Anderson's advice并切换到JSON,因为它可以节省您的时间并使事情正常化。

$rawData = file_get_contents("data.txt");
$users   = array();
$tmpUser = array();

foreach ( file("data.txt", FILE_IGNORE_NEW_LINES) as $line ) {
    // Blank line denotes the end of a record
    if ( empty($line) ) {
        $users[] = $tmpUser;
        $tmpUser = array();
        continue;
    }

    list($key, $value) = explode("=", $line, 2);
    $tmpUser[ strtolower(trim($key)) ] = trim($value); 
}

// Add last record
if ( !empty($tmpUser) ) {
    $users[] = $tmpUser;
}

print_r($users);

结果

Array
(
    [0] => Array
        (
            [user] => Test
            [age] => 18
            [gender] => F
        )

    [1] => Array
        (
            [user] => Test2
            [age] => 34
            [gender] => M
        )

)

我意识到你特意要求能够获得用户名;但是,无论你想要完成什么,这都可能更有益。