Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Jak utworzyć pliki pobierając nazwy z tablicy
farben
post 14.01.2018, 03:41:16
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.01.2018

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
SmokAnalog
post 14.01.2018, 04:33:01
Post #2





Grupa: Zarejestrowani
Postów: 1 402
Pomógł: 231
Dołączył: 3.07.2012
Skąd: Poznań

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
farben
post 14.01.2018, 10:00:23
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.01.2018

Ostrzeżenie: (0%)
-----


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

Go to the top of the page
+Quote Post
trzczy
post 14.01.2018, 10:37:41
Post #4





Grupa: Zarejestrowani
Postów: 402
Pomógł: 46
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


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


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

Powinno coś powiedzieć

Ten post edytował trzczy 14.01.2018, 10:40:28
Go to the top of the page
+Quote Post
Pyton_000
post 14.01.2018, 12:08:36
Post #5





Grupa: Zarejestrowani
Postów: 7 313
Pomógł: 1291
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
farben
post 14.01.2018, 13:10:38
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.01.2018

Ostrzeżenie: (0%)
-----


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. )


Go to the top of the page
+Quote Post
trzczy
post 14.01.2018, 13:50:02
Post #7





Grupa: Zarejestrowani
Postów: 402
Pomógł: 46
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
farben
post 14.01.2018, 15:02:30
Post #8





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.01.2018

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
trzczy
post 14.01.2018, 15:19:12
Post #9





Grupa: Zarejestrowani
Postów: 402
Pomógł: 46
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


A to stworzy 2 pliki? Spróbuj testowo:
  1. file_put_contents('plik1 ', 'plik1 ');
  2. file_put_contents('plik2', 'plik2');


Ten post edytował trzczy 14.01.2018, 15:22:15
Go to the top of the page
+Quote Post
farben
post 14.01.2018, 15:50:19
Post #10





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.01.2018

Ostrzeżenie: (0%)
-----


Jak zrobię to ręcznie oba pliki są tworzone, z pętli nie mogę, foreach również..
Go to the top of the page
+Quote Post
Evinek
post 14.01.2018, 16:09:11
Post #11





Grupa: Zarejestrowani
Postów: 278
Pomógł: 46
Dołączył: 23.03.2010
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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] =>
        )

)
Go to the top of the page
+Quote Post
trzczy
post 14.01.2018, 18:45:52
Post #12





Grupa: Zarejestrowani
Postów: 402
Pomógł: 46
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
farben
post 16.01.2018, 23:52:25
Post #13





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 14.01.2018

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.05.2018 - 12:58