Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Jak utworzyć pliki pobierając nazwy z tablicy
Forum PHP.pl > Forum > Przedszkole
farben
Witam,

próbuję sklecić prosty skrypt który będzie mi pobierał dane z pliku tekstowego zawierającego dane w oddzielnych linijkach (228) a dodatkowo dane w tej samej linijce odseparowane znakiem "|".

aaaaaa|bbbbbb|cccccccc|ddddddd|nazwa

Wszystko wygląda dobrze, tzn tablica pobiera sobie dane i ładnie się wyświetla ale kiedy dodaję linijkę tworzenia pliku pętla tworzy mi tylko 1 plik z nazwą z ostatniej linijki danych wejściowych jak poniżej:

  1. <?php
  2.  
  3. $plik = file_get_contents("dane.txt");
  4.  
  5. $plik = explode("\n", $plik);
  6.  
  7. for($i=0; $i<count($plik); ++$i) {
  8. $out[$i] = explode("|", $plik[$i]);
  9. file_put_contents($out[$i][4], $out[$i][4]);
  10. }
  11.  
  12. echo "<pre>";
  13. print_r($out);
  14. echo "</pre>";
  15.  
  16. ?>


Dlaczego pętla nie tworzy mi każdego pliku?

Z góry dziękuję za naprowadzenie.
SmokAnalog
Witaj na forum.

Powoli. Po pierwsze, plik możesz odczytać funkcją file zamiast robić explode po znaku nowej linii.

Kod wymaga kilku poprawek, ale powinien działać. Jeśli tworzy Ci się jeden plik, to może masz błędne dane w dane.txt? Upewnij się czy na pewno masz różne nazwy w piątej kolumnie.
farben
Dane są poprawne, tablica printuje się poprawnie. Próbowałem zmienić pętle for na while ale skutek taki sam. Tworzy się plik z tylko z nazwa z ostatniego rekordu tablicy.

  1. <?php
  2. $plik = file("dane.txt");
  3. $linie = count($plik);
  4. $i = 0;
  5.  
  6. while($i != $linie) {
  7. $out[$i] = explode("|", $plik[$i]);
  8. file_put_contents($out[$i][4], $out[$i][4]);
  9. $i++;
  10. }
  11.  
  12. echo "<pre>";
  13. print_r($out);
  14. echo "</pre>";
  15.  
  16. ?>


Może to dzieje się za szybko i serwer nie nadąża z tworzeniem pliku przed przejściem do następnego rekordu? wink.gif

trzczy
Ustaw wyświetlanie błędów, to raz.


Dwa, wstaw po 7. linii taki kod:
  1. var_dump($out[$i][4]);

Powinno coś powiedzieć
Pyton_000
1. przeczytaj dokumentację file(). Znajdziesz tam magiczną stałą która ignoruje nowe linie.
2. do iterowania po tablicach użyj foreach
3. Sprawdź czy aby na pewno plik z danymi masz poprawny.
farben
Cytat(trzczy @ 14.01.2018, 10:37:41 ) *
Ustaw wyświetlanie błędów, to raz.


Dwa, wstaw po 7. linii taki kod:
  1. var_dump($out[$i][4]);

Powinno coś powiedzieć


Zrobiłem zwraca poniższe:

  1. string(6) "plik1 " string(5) "plik2"
  2. (
  3. [0] => Array
  4. (
  5. [0] => aaaaaa
  6. [1] => bbbbbb
  7. [2] => cccccc
  8. [3] => dddddd
  9. [4] => plik1
  10. )
  11.  
  12. [1] => Array
  13. (
  14. [0] => aaaaaa
  15. [1] => bbbbbb
  16. [2] => cccccc
  17. [3] => dddddd
  18. [4] => plik2
  19. )
  20.  
  21. )


trzczy
Cytat(farben @ 14.01.2018, 03:41:16 ) *
oddzielnych linijkach (228)


To znaczy, że linijek jest 228? Bo wtedy wygląda dziwnie, że wyświetlana tablica ma tylko 2 tablice wewnątrz.
farben
Linii jest więcej przyciąłem dane do dwóch linijek by wyeliminować ewentualne błędy w danych, ale mimo to tworzony jest jedynie plik2.
trzczy
A to stworzy 2 pliki? Spróbuj testowo:
  1. file_put_contents('plik1 ', 'plik1 ');
  2. file_put_contents('plik2', 'plik2');
farben
Jak zrobię to ręcznie oba pliki są tworzone, z pętli nie mogę, foreach również..
Evinek
Tylko ten skrypt uruchamiasz? Mi działa poprawnie nie licząc błędu, który łatwo poprawić (dodać np. trim).
Tworzy poprawnie pliki (nazwa, nazwa2, nazwa3) z prawidłową zawartością.
Spróbuj dać dane, które ja dałem i sprawdź czy działa poprawnie (umieść moje dane wejściowe do swojego pliku).
Jeśli zadziała to oznacza, że Twój plik jest niepoprawny przez co skrypt nie działa poprawnie.

Dane wejściowe:

Kod
aaaaaa|bbbbbb|cccccccc|ddddddd|nazwa
aaaaaa|bbbbbb|cccccccc|ddddddd|nazwa2
aaaaaa|bbbbbb|cccccccc|ddddddd|nazwa3


Kod
PHP Notice:  Undefined offset: 4 in /home/sphere/tmp/test.php on line 9
PHP Notice:  Undefined offset: 4 in /home/sphere/tmp/test.php on line 9
PHP Warning:  file_put_contents(): Filename cannot be empty in /home/sphere/tmp/test.php on line 9
<pre>Array
(
    [0] => Array
        (
            [0] => aaaaaa
            [1] => bbbbbb
            [2] => cccccccc
            [3] => ddddddd
            [4] => nazwa
        )

    [1] => Array
        (
            [0] => aaaaaa
            [1] => bbbbbb
            [2] => cccccccc
            [3] => ddddddd
            [4] => nazwa2
        )

    [2] => Array
        (
            [0] => aaaaaa
            [1] => bbbbbb
            [2] => cccccccc
            [3] => ddddddd
            [4] => nazwa3
        )

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

)
trzczy
Zdaje się, że ten plik txt jest tworzony w windows i znaki \r czynią chaos. Lektura https://stackoverflow.com/questions/3274916...from-a-txt-file
farben
Muszę sprawdzić jak będzie na całym pliku ale na testowych danych działa, tak więc wygląda na problem z liniami. Próbowałem na innych serwerach, na jednym tworzyły się 2 pliki ale pierwszy był jakby zablokowany, problem z usunięciem. Na moim lokalnym skrypt zadziałał od razu. Także wygląda na to że serwer ma wpływ na tak prosty skrypt wink.gif

Dziękuję za pomoc. Poniższy kod działa w 100%, może komuś się przyda.

  1. <?php
  2. $plik = file('dane.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
  3.  
  4. echo count($plik).'<br />';
  5. foreach($plik as $tablica)
  6.  
  7. {
  8. $out = explode("|", $tablica);
  9.  
  10. file_put_contents($out[4], $out[4]);
  11. echo "Utworzono plik: '.$out[4] <br />";
  12. }
  13.  
  14. ?>
  15.  
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.