2016-07-15 8 views
1

私が読む必要があるテキストファイルがあり、そのデータを使用しています。PHPがテキストファイルからデータを読み取っています

3 
sam 99912222 
tom 11122222 
harry 12299933 
sam 
edward 
harry 

これらの文字列の配列を次の形式で作成するにはどうすればよいですか?

array(
    "name" => "number" 
    ... 
) 

私はこの試みた:その後、

$handle = fopen("file.txt", "r"); 
fscanf($handle, "%d %d", $name, $number); 

何を?私が何をしようと、それは最初の行のためにのみ動作します。ファイル内

sam 99912222 
+0

何なし名前/番号のラインは? – FirstOne

答えて

2

を追加しましたコード:それはただ単に、このような1行に正規表現を持つ行を変更し、完全な形式のデータを取り出すようにするに

値のペア。


の下にそれらをチェックしてください。このコードは、各ラインを通過し、両方 namevaluesomething[space]something))を持っているものだけを取得します。

//$lines = ... each line of the file in an array 

$vals = array(); 
foreach($lines as $v){ 
    $tmp = explode(' ', $v); 
    if(count($tmp) > 1){ 
     $vals[trim($tmp[0])] = trim($tmp[1]); // trim to prevent garbage 
    } 
} 

print_r($vals); 

それはなり出力をこの:

Array 
(
    [sam] => 99912222 
    [tom] => 11122222 
    [harry] => 12299933 
) 

コードを参照してください。実際にはhereです。


彼らは、対になって、このようにそれをしなかった場合でも、あなたは値が必要な場合:

//$lines = ... each line of the file 

$vals = array(); 
foreach($lines as $v){ 
    $tmp = explode(' ', $v); 
    $name = ''; 
    $number = ''; 
    $tmp[0] = trim($tmp[0]); 
    if(count($tmp) > 1){ 
     $name = $tmp[0]; 
     $number = trim($tmp[1]); 
    }else{ 
     if(is_numeric($tmp[0])){ 
      $number = $tmp[0]; 
     }else{ 
      $name = $tmp[0]; 
     } 

    } 
    $vals[] = array(
     'name' => $name, 
     'number' => $number 
    ); 
} 

print_r($vals); 

そして出力:

Array 
(
    [0] => Array 
     (
      [name] => 
      [number] => 3 
     ) 

    [1] => Array 
     (
      [name] => sam 
      [number] => 99912222 
     ) 

    [2] => Array 
     (
      [name] => tom 
      [number] => 11122222 
     ) 

    [3] => Array 
     (
      [name] => harry 
      [number] => 12299933 
     ) 

    [4] => Array 
     (
      [name] => sam 
      [number] => 
     ) 

    [5] => Array 
     (
      [name] => edward 
      [number] => 
     ) 

    [6] => Array 
     (
      [name] => harry 
      [number] => 
     ) 

は、アクション内のコードを参照してください。 here

+0

あなたは私の "up vote"を持っています。あなたは私を助けようとあなたの時間を過ごす –

1

データが矛盾している、の最高は、各ラインから持っているもののデータを識別するために正規表現を使用することです。

$lines = file('file.txt'); // this will open file and split them into lines 
$items = array(); 
foreach($lines as $line){ 
    $name = null; 
    $number = null; 
    $nameFound = preg_match("|([A-Za-z]+)|", $line, $matches); 
    if($nameFound){ 
     $name = $matches[0]; 
    } 
    $numberFound = preg_match("|([0-9]+)|", $line, $matches); 
    if($numberFound){ 
     $number = $matches[0]; 
    } 

    $items[] = array('name' => $name, 'number' => $number); 
} 

次に、ファイルから解析されたデータを見つける必要があります。 - 無視し、名前を持っていないラインを含む出力の両方のタイプを持っている

$lines = file('file.txt'); // this will open file and split them into lines 
$items = array(); 
foreach($lines as $line){ 
    $userFound = preg_match("/([A-Za-z]+) ([0-9]+)/", $line, $matches); 
    if($userFound){ 
     $items[$matches[1]] = $matches[2]; 
    } 

} 
+0

これをテストしたところ、うまくいかなかったようです... [https://eval.in/605956](https://eval.in/605956)(私はopではないことに注意してください) – FirstOne

+1

ありました$ matchesのスペルミスが今すぐ試してください – Kamil

+0

この問題で私の入力フォームは$ _fp = fopen( "php:// stdin"、 "r")です。私はそれを変更することはできません。これは、入力からデータを受け取る方法は単一の方法です –

1

以下のアルゴリズムを使用すると、各行の最初の単語または数字をキーとして、2番目の単語を値として持つテキストファイルコンテンツの個々の行を単純に解析できます。 2番目の単語または単語のグループが存在しない場合は、そのキーにNULLが割り当てられます。再利用性のために、このアルゴリズムは関数にカプセル化されています。ここに行く:

<?php 

    function parseTxtFile($txtFile){ 
     $arrTxtContent  = []; 

     if(!file_exists($txtFile)){ return null;} 
     $strFWriteTxtData = file_get_contents($txtFile); 

     if(empty($strFWriteTxtData)){return null;} 

     $arrFWriteInfo  = explode("\n", $strFWriteTxtData); 

     foreach($arrFWriteInfo as $iKey=>$lineData){ 
      $arrWriteData = explode(", ", $lineData); 
      foreach($arrWriteData as $intKey=>$strKeyInfo){ 
       preg_match("#(^[a-z0-9_A-Z]*)(\s)(.*$)#i", $strKeyInfo, $matches); 
       preg_match("#(^[a-z0-9_A-Z]*)(\s*)?$#i", $strKeyInfo, $matches2); 
       if($matches) { 
        list(, $key, $null, $val) = $matches; 
        if (!array_key_exists($key, $arrTxtContent)) { 
         $arrTxtContent[$key] = $val; 
        }else{ 
         $iKey = $intKey + 1; 
         $key = $key . "_{$iKey}"; 
         $arrTxtContent[$key] = $val; 
        } 
       }else if($matches2) { 
        list(, $key, $null) = $matches2; 
        if (!array_key_exists($key, $arrTxtContent)) { 
         $arrTxtContent[$key] = null; 
        }else{ 
         $key = preg_match("#_\d+#", $key, $match)? $key . $match[0] : "{$key}_1"; 
         $arrTxtContent[$key] = null; 
        } 
       } 
      } 
     } 
     return $arrTxtContent; 
    } 

    var_dump(parseTxtFile(__DIR__ . "/data.txt")); 

ちょうどあなたのテキストファイルにそれをパスを渡す機能parseTxtFile($txtFile)を呼び出すと、それは以下のようになります配列を返します。

array (size=7) 
     3   => null 
     'sam'  => string '99912222' (length=8) 
     'tom'  => string '11122222' (length=8) 
     'harry' => string '12299933' (length=8) 
     'sam_1' => null 
     'edward' => null 
     'harry_1' => null 

これはビットを助けることを願って。 ...

乾杯&グッド・ラック;-)

関連する問題