Txt dosyasının her satırını yeni dizi öğesine oku


118

Bir metin dosyasının her satırını bir diziye okumaya ve her satırı yeni bir öğede tutmaya çalışıyorum.
Şimdiye kadarki kodum.

<?php
$file = fopen("members.txt", "r");
$i = 0;
while (!feof($file)) {

$line_of_text = fgets($file);
$members = explode('\n', $line_of_text);
fclose($file);

?>

1
Dizide kodunuz olduğu gibi saklanan herhangi bir şey var mı? Hangi özel problemin var?
Chris Bornhoft

1
Uyarı: fopen'dan gelen YANLIŞ uyarı verir ve burada sonsuz döngüye neden olur. php.net/manual/en/function.feof.php
Gjermund Dahl

İş parçacığının tarihine rağmen, bir kaçış dizisi olarak ayrıştırılması '\n\'için a olması gerekirken patlatılmayacaktır "\n".
codekandis

Yanıtlar:


396

Herhangi bir özel işleme ihtiyacınız yoksa, bu aradığınız şeyi yapmalıdır

$lines = file($filename, FILE_IGNORE_NEW_LINES);

file()diziye file_get_contents+ göre oldukça yavaş görünüyorexplode
Ron

@Ron Katılıyorum. Sonra tekrar, her istekte bu şekilde bir dosya okumamalısınız. Çözüm optimal olsa bile bu çok saçma. Dosyanın içeriği ya bellek önbelleğinde ya da hatta bir veritabanında saklanmalıdır. PHP bile ayrıştırılmış dosyaların içeriğini saklar. Demek istediğim, PHP 4.3'ten uzağız
Yanick Rochon

35

Bulduğum en hızlı yol:

// Open the file
$fp = @fopen($filename, 'r'); 

// Add each line to an array
if ($fp) {
   $array = explode("\n", fread($fp, filesize($filename)));
}

$ dosyaadı dosyanızın yolu ve adı olacaktır, örn. ../filename.txt.

Metin dosyanızı nasıl kurduğunuza bağlı olarak, \ n bit ile biraz uğraşmanız gerekebilir.


1
"\ N" yerine "PHP_EOL" kullanırdım, bu öyle görünüyor, $ dizi = patlat (PHP_EOL, fread ($ fp, dosya adı ($ dosyaadı)));
Fabian Harmsen

Teşekkürler Drew, birçok işlevi denedikten sonra, işe yarayan tek şey seninki. Arama terimim sizin \ n yerine <br>. Dosyam tek bir büyük değerli dizi olarak okunuyordu, tüm metin yalnızca bir dizi öğesi $ myarr [0] idi, bu nedenle karıştırma tek bir öğede çalışmadı. Umarım birine yardımcı olur. Tekrar teşekkürler.
washere

27

Sadece şunu kullan:

$array = explode("\n", file_get_contents('file.txt'));

26
$yourArray = file("pathToFile.txt", FILE_IGNORE_NEW_LINES);

FILE_IGNORE_NEW_LINESher dizi elemanının sonuna yeni satır eklemekten kaçının Boş satırları atlamak için
de kullanabilirsinizFILE_SKIP_EMPTY_LINES

burada referans


23
<?php
$file = fopen("members.txt", "r");
$members = array();

while (!feof($file)) {
   $members[] = fgets($file);
}

fclose($file);

var_dump($members);
?>

1
Tamam, mükemmel çalışıyorum teşekkürler. Bununla birlikte, bir dizi öğesine bir geçerli = ayarlamam gerekiyor. $ var = $ ary [1]; çalışmıyor. ary [1] = "test". Yardımı dokunursa.
Dan

1
Kendiniz bir sayaç çalıştırın ve dizideki dizini ayarlayın
Prasad

7
$lines = array();
while (($line = fgets($file)) !== false)
    array_push($lines, $line);

Açıkçası, önce bir dosya tanıtıcısı oluşturmanız ve içinde saklamanız gerekir $file.


7

Bu kadar kolay:

$lines = explode("\n", file_get_contents('foo.txt'));

file_get_contents() - tüm dosyayı dizge olarak alır.

explode("\n")- dizeyi sınırlayıcı ile böler "\n"- bir satırsonu için ASCII-LF kaçışı nedir.

Ancak dikkatli olun - dosyanın UNIX- Satır sonlarına sahip olup olmadığını kontrol edin .

eğer "\n"düzgün çalışmaz bir diğer yeni satır OF2 kodlama var ve deneyebilirsiniz "\r\n", "\r"ya da"\025"


3
$file = __DIR__."/file1.txt";
$f = fopen($file, "r");
$array1 = array();

while ( $line = fgets($f, 1000) )
{
    $nl = mb_strtolower($line,'UTF-8');
    $array1[] = $nl;
}

print_r($array);

1

Doğru yoldaydınız, ancak gönderdiğiniz kodla ilgili bazı sorunlar vardı. Her şeyden önce, while döngüsü için bir kapatma ayracı yoktu. İkinci olarak, her döngü yinelemesinde $ line_of_text'in üzerine yazılır, bu döngüde = öğesini a. = Olarak değiştirerek sabitlenir. Üçüncüsü, gerçek bir satırsonu değil, '\ n' harf karakterlerini patlatıyorsunuz; PHP'de, tek tırnaklar değişmez karakterleri belirtir, ancak çift tırnaklar aslında kaçan karakterleri ve değişkenleri yorumlar.

    <?php
        $file = fopen("members.txt", "r");
        $i = 0;
        while (!feof($file)) {
            $line_of_text .= fgets($file);
        }
        $members = explode("\n", $line_of_text);
        fclose($file);
        print_r($members);
    ?>

1
    $file = file("links.txt");
print_r($file);

Bu, txt dosyasını dizi olarak kabul edecektir. Bu yüzden links.txt dosyasına herhangi bir şey yazın (bir öğe için bir satır kullanın) sonra bu sayfayı çalıştırın :) diziniz $ dosya olacak


0

Bu, burada oldukça iyi ele alınmıştır, ancak burada listelenen herhangi bir şeyden GERÇEKTEN daha iyi performansa ihtiyacınız varsa, kullanılan bu yaklaşımı kullanabilirsiniz strtok.

$Names_Keys = [];
$Name = strtok(file_get_contents($file), "\n");
while ($Name !== false) {
    $Names_Keys[$Name] = 0;
    $Name = strtok("\n");
}

Bu, dosyanızın \nsatırsonu karakteri olarak kaydedildiğini varsayar (bunu gerektiği gibi güncelleyebilirsiniz) ve ayrıca sözcükleri / adları / satırları değerler yerine dizi anahtarları olarak saklar, böylece onu bir issetyerine (çok, çok daha hızlı) kullanımına izin veren arama tablosu in_array.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.