将txt文件的内容拆分成数组

5

我遇到了一个问题,无法将.txt文件中的内容分解(结构如下):

    01Name 1 
    02whatever contents
    03whatever contents
    -------------------
    01Name 2
    02whatever contents
    03whatever contents

正如您所看到的,"delimiter"是"-------------------"。现在的问题是:如何将此文件分解为数组,以便我可以搜索特定的名称并显示该块的内容?我尝试过这样分解:
  header("Content-type:text/plain");
  $file = fopen("cc/cc.txt", "r");


  while (!feof($file)) {
    $lot = fgets($file);
    $chunk = explode("-------------------",$lot);

    print_r($chunk);

  }

  fclose($file);             

并得到以下结果:

    Array
    (
        [0] => 01Name 1 

    )
    Array
    (
        [0] => 02whatever contents

    )
    Array
    (
        [0] => 03whatever contents

    )
    Array
    (
        [0] => -------------------

    )
    Array
    (
        [0] => 01Name 2

    )
    Array
    (
        [0] => 02whatever contents

    )
    Array
    (
        [0] => 03whatever contents
    )        

当我想要得到这个结果时:
    Array
    (
        [0] => 01Name 1
        [1] => 02whatever contents
        [2] => 03whatever contents

    )
    Array
    (
        [0] => 01Name 2
        [1] => 02whatever contents
        [2] => 03whatever contents
    )

我已经搜索了PHP; 将fgets()的输出分配给数组将txt文件的每一行读入新的数组元素中,但没有找到合适的答案。 有什么想法吗?

1
你不能爆炸一个txt文件,但你可以爆炸txt文件的内容... - Mr. Alien
4个回答

5
您可以使用以下内容:
$result = array();
$file = explode("-------------------", file_get_contents("cc/cc.txt"));
foreach ( $file as $content ) {
    $result[] = array_filter(array_map("trim", explode("\n", $content)));
}
var_dump($result);

输出

array
  0 => 
    array
      0 => string '01Name 1' (length=8)
      1 => string '02whatever contents' (length=19)
      2 => string '03whatever contents' (length=19)
  1 => 
    array
      1 => string '01Name 2' (length=8)
      2 => string '02whatever contents' (length=19)
      3 => string '03whatever contents' (length=19)

您可以进一步发展
$result = array();
$file = explode("-------------------", file_get_contents("cc/cc.txt"));
foreach ( $file as $content ) 
{
    foreach(array_filter(array_map("trim",explode("\n", $content))) as $line)
    {
        list($key,$value) = explode(" ", $line);
        $result[$key] = $value ;
    }
}
var_dump($result);

输出

array
  '01Name' => string '2' (length=1)
  '02whatever' => string 'contents' (length=8)
  '03whatever' => string 'contents' (length=8)

你的第一个选项成功了!现在只需要循环遍历数组...谢谢!!! - MrsSammartino
你选择了另一个答案而不是我的……每次只能选择一个答案。 - Baba

0

首先,你应该使用{{link1:file()}}逐行读取和拆分文件。这是专门为此目的而内置的。

你对于"-------------------"的判断失败了,因为你没有考虑到尾随的换行符(\r\n等)。 (使用file()函数的FILE_IGNORE_NEW_LINES作为一种解决方案)。 虽然在这里使用正则表达式可能更好:

$lines = file($filename);
foreach ($lines as $line) {
    if (preg_match('/^\s*---------+\R*$/', $line)) { ... }
}

这种方式有点冗余,但更加弹性。

你也可以使用 file_get_contents 读取整个文件,并使用 preg_split 分割文本块。


preg_split在这种情况下不适用,除此之外,它运行良好!谢谢! - MrsSammartino

0
如果您的文件格式一致,每个数据块有三行,那么您可以简单地按照这种方式解析它。在这里,我正在创建整个文件的二维数组:
<?php

header("Content-type:text/plain");
$file = fopen("cc.txt", "r");

$alldata = array();
$index = 0;
while (!feof($file))
{
    $alldata[$index]['name'] = fgets($file);
    $alldata[$index]['c1'] = fgets($file);
    $alldata[$index]['c2'] = fgets($file);
    fgets($file); // throw away delimiter line
    $index++;
}
fclose($file);  

print_r($alldata);
?>

这会输出:
Array
(
    [0] => Array
        (
            [name] => 01Name 1 
            [c1] => 02whatever contents
            [c2] => 03whatever contents
        )
    [1] => Array
        (
            [name] => 01Name 2
            [c1] => 02whatever contents
            [c2] => 03whatever contents
        )
)

很不幸,我刚刚编辑了我的txt文件以提高可读性...实际的文本文件大约有2800行...而每个块的行数是不一致的。 - MrsSammartino

0
$c      = file_get_contents($file);
$lines  = explode("-------------------", $c);
foreach ($lines as $l) {
    if (strpos($l, 'keyword') !== false) {
        echo $l;
        die();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接