Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> dzielenie pliku tekstowego
jarmiar
post
Post #1





Grupa: Zarejestrowani
Postów: 616
Pomógł: 12
Dołączył: 16.07.2006
Skąd: : getCity ( );

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


czesc

mam problem

mam plik tekstowy, ktory ma 500tys linii.

chce go podzielic na kilkaset plikow po 200 linii

jak to zrobic? chodzi mi o algorytm
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


No dobra a gdzie problem? (IMG:style_emoticons/default/smile.gif)
Tutaj jest pomoc a nie gotowe rozwiązania.
Go to the top of the page
+Quote Post
wookieb
post
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




1) Otwierasz jeden duży plik $f1 (fopen)
2) Otwierasz drugi plik do którego bedziesz zapisywać $f2
3) Lecisz po $f1 while + feof
4) Odczytujesz linijke fgets
5) wrzucasz do $f2 fwrite
6) oczywiście organizujesz sobie jakieś liczniki np co do ilości linii albo ilości bajtów. W momencie przekroczenia jakiegoś limitu zamykasz $f2 i tworzysz drugi pod inną nazwą.
Go to the top of the page
+Quote Post
jarmiar
post
Post #4





Grupa: Zarejestrowani
Postów: 616
Pomógł: 12
Dołączył: 16.07.2006
Skąd: : getCity ( );

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


mi chodzi o cos takiego:"

otwieram plik file()

i np w pętli for lece

for($i=0; $i<count($open); $i++)
{
if($i%200 != 0)
{

}
}

jakos tak jak to dokladnie napisac zeby np zapisywal dobrze
Go to the top of the page
+Quote Post
wookieb
post
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




No to najprosciej uzyc file_put_contents.
Ale nie wiem jak ty chcesz otworzyć tak duzy plik za pomoca file...
najszybciej będzie właśnie z fopen
Go to the top of the page
+Quote Post
jarmiar
post
Post #6





Grupa: Zarejestrowani
Postów: 616
Pomógł: 12
Dołączył: 16.07.2006
Skąd: : getCity ( );

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


no ok tak zrobie, ale nie wiesz dokladnie o co mi chodzi

nie wiem jak napisac ten algorytm zeby po wielokrotnosci np 200 zapisywało te linie do nowego pliku tekstowego o nazwie part_1.txt gdzie 1 to kolejna cyfra dpisywana automatycznie

dobrze kombinuje z modulo?
Go to the top of the page
+Quote Post
skowron-line
post
Post #7





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(jarmiar @ 22.07.2010, 20:42:26 ) *
dobrze kombinuje z modulo?

No pięknie kombinujesz ale po co (IMG:style_emoticons/default/questionmark.gif) Kolega dał Ci prawie gotowca wystarczy przeczytać i się zastanowić.
Zobacz sobie jak w jakim tempie załaduje Ci się tablica 5000 rekordów z pliku.
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. $length = count($open)
  2. $ileLinii = 200;
  3. for($i=0; $i<$length; $i++)
  4. {
  5. $part = floor($i/$ileLinii) + 1; // numer parta
  6. }

Wersja z modulo
  1. $length = count($open)
  2. $ileLinii = 200;
  3. $part = 1;
  4. for($i=0; $i<$length; $i++)
  5. {
  6. if (($i%$ileLinii) == 0) $part++;
  7.  
  8. }
Go to the top of the page
+Quote Post
Fifi209
post
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(jarmiar @ 22.07.2010, 21:42:26 ) *
no ok tak zrobie, ale nie wiesz dokladnie o co mi chodzi

nie wiem jak napisac ten algorytm zeby po wielokrotnosci np 200 zapisywało te linie do nowego pliku tekstowego o nazwie part_1.txt gdzie 1 to kolejna cyfra dpisywana automatycznie

dobrze kombinuje z modulo?


Może być i moduło ale ja wymyśliłem na poczekaniu coś takiego:
  1. <?php
  2.  
  3. $file = fopen('test.txt', 'r');
  4.  
  5. $temp = array();
  6. $x=1;
  7.  
  8. while (!feof($file)) {
  9. $temp[] = fgets($file, 100);
  10. if (count($temp) == 200) {
  11. file_put_contents('part_'.$x.'.txt', implode("\n", $temp));
  12. $temp = array();
  13. $x++;
  14. }
  15. }
  16.  
  17. fclose($file);
  18.  
  19. ?>


ale nie wiem czy działa bo nie mogę przetestować.
Go to the top of the page
+Quote Post
jarmiar
post
Post #10





Grupa: Zarejestrowani
Postów: 616
Pomógł: 12
Dołączył: 16.07.2006
Skąd: : getCity ( );

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


tak to bym sam potrafil, ale nadal nie doszlismy do sedna sprawy, jak te linie zapisac wg wielokrotnosci 200

np dajmy na to pętla przeleciała pierwsze 200 linii, limit uopłynął i trzeba zapisać te linie do pliku, potem leci kolejne 200 i zapisuje te kolejne 200
Go to the top of the page
+Quote Post
Fifi209
post
Post #11





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(jarmiar @ 22.07.2010, 21:52:09 ) *
tak to bym sam potrafil, ale nadal nie doszlismy do sedna sprawy, jak te linie zapisac wg wielokrotnosci 200

np dajmy na to pętla przeleciała pierwsze 200 linii, limit uopłynął i trzeba zapisać te linie do pliku, potem leci kolejne 200 i zapisuje te kolejne 200


To też Ci pokazałem +/- jak masz to zrobić...

Skoro byś sam potrafił, to mogłeś nie pytać tylko robić samemu...

Ten post edytował fifi209 22.07.2010, 21:54:18
Go to the top of the page
+Quote Post
jarmiar
post
Post #12





Grupa: Zarejestrowani
Postów: 616
Pomógł: 12
Dołączył: 16.07.2006
Skąd: : getCity ( );

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


nie chodzilo o ciebie, twoje rozwiązanie działa pięknie z tym ze wstawia podwójne linie tzn puste linie są też, ale ogolnie ok, daje plusik
Go to the top of the page
+Quote Post
Fifi209
post
Post #13





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(jarmiar @ 22.07.2010, 21:57:08 ) *
nie chodzilo o ciebie, twoje rozwiązanie działa pięknie z tym ze wstawia podwójne linie tzn puste linie są też, ale ogolnie ok, daje plusik

przy implode usuń "\n" bo może być tak, że fgets po prostu pobiera ze znakiem nowej linii ;p
Go to the top of the page
+Quote Post
jarmiar
post
Post #14





Grupa: Zarejestrowani
Postów: 616
Pomógł: 12
Dołączył: 16.07.2006
Skąd: : getCity ( );

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


wziąłem sobie strimowałem trim() i smiga
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.12.2025 - 11:19