Düz dosya Ayrıştırma

7 Cevap

I php kullanarak bir metin dosyasını okumak istediğinizi varsayalım.

Şimdi benim metin dosyası içerir

User=Test
Age=18
Gender=F

User=Test2
Age=34
Gender=M

ve bunun gibi şu.

Şimdi ben metin dosyasını okuyun ve üyeler yalnızca değerini bulmak için php kullanmak istiyorum diyelim = ve görüntülemek.

Bunu gerçekleştirmek için en kolay yolu nedir?

Teşekkür ederim.

7 Cevap

$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);
      }
}

Yukarıdaki bilgi her bit User= harf duyarlı olduğunu, yeni bir hat üzerinde olduğunu ve bütün dosya döngü ile tamam olduğunu varsayar. Sen User= sağ tarafında sadece kullanıcı adları döndürülen bir dizi alacak.

Eğer bir sütun ortaya yankılandı olmak için bu istiyorsanız, $ kullanıcılar dizi inşa alır biraz değiştirmek, ya da sonuna kadar bu ekleme ya:

 echo implode("\n" $users);

This may be more than you're looking for, but if you're looking to parse a text file and you're not tied to a specificformat you should use one that php has inbuilt support for. To me the two most obvious options are XML and JSON. IMHO JSON is probably easiest.

Sizin örnekte veri dosyası gibi görünebilir

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

Ondan okumak için php olurdu

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

Şimdi $ m herhangi bir dizi yaptığınız gibi çalışabilirsiniz

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

Belirli bir değer arıyorsanız sürece, temelde bellek için tüm dosyayı okumak zorunda gidiyoruz. Bu gibi, satır-satır ve çıkış "Kullanıcı" ile başlayan herhangi bir satır okuyabilir:

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

Eğer daha yararlı bir biçimde bilgi istedim, kullanıcılara bir diziye onu kırabilir. Dosyanızın her "bölümünde" çift yeni satır ile ayrılmış olduğunu varsayarsak, bunu yapabilirsiniz:

$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'];

Açıkçası bu (örneğin "\ n" karakteri tarafından ayrılmış tüm hatları gibi) veri hakkında varsayımlar yapar, ama fikir olsun.

Sen fgets() dosyanın bir hat almak ve uygun metinle başlayan olmadığını test etmek başlangıcını substrine deneyebilirsiniz. Kolay yolu olabilir.

<?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.php, http://www.phpfreaks.com/forums/index.php?topic=213127.0 Alındığı

Eğer anlatılan biçimi ile sıkışmış / evli iseniz, o zaman aşağıda benim kodu deneyebilirsiniz. Bu size kolayca çalışabilirsiniz güzel bir dizi verecektir. Aksi takdirde, ben Michael Anderson's advice almak ve size zaman kazandıracak ve şeyler biraz normalleştirmek gibi JSON üzerinden geçiş öneririz.

$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);

Sonuç

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

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

)

Ben sadece kullanıcı adını almak edebilmek için özellikle sordum fark; Ancak, bu muhtemelen gerçekleştirmek için çalışıyoruz ne olursa olsun vadede daha faydalı olacaktır.

chk bu kod

<?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);
?>

Daha fazla bilgi chk için bu here