5

.txt ファイル (以下の構造) のコンテンツを展開する際に問題があります。

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

ご覧のとおり、「区切り文字」は「-------------------」です。ここで問題は、このファイルを配列に分解して、特定の名前を検索し、そのブロックの内容を表示する方法です。私はこのように爆発しようとしました:

  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 ファイルの各行を新しい配列要素に読み込みますが、うまくいきません。

何かご意見は?

4

4 に答える 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)
于 2012-10-03T16:27:36.973 に答える
0
$c      = file_get_contents($file);
$lines  = explode("-------------------", $c);
foreach ($lines as $l) {
    if (strpos($l, 'keyword') !== false) {
        echo $l;
        die();
    }
}
于 2012-10-03T16:29:32.293 に答える
0

まずfile()、ファイルを行ごとに読み取り、分割するために使用する必要があります。それは特にその目的のために組み込まれています。

末尾の改行(など)を考慮"-------------------"していないため、チェックは失敗します。\r\n(1つのソリューションとしてFILE_IGNORE_NEW_LINESの機能に使用)。file()ここで正規表現を使用する方が良いかもしれませんが:

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

この方法は少し冗長ですが、より回復力があります。

代わりにでファイル全体を読み取り、file_get_contentsテキスト ブロックを分割することもできますpreg_split

于 2012-10-03T16:22:55.247 に答える
0

ファイルが一貫してフォーマットされており、データのブロックごとに 3 行ある場合は、単純にそのように解析できます。ここでは、ファイル全体の 2 次元配列を作成しています。

<?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
        )
)
于 2012-10-03T16:27:06.850 に答える