Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dzielenie pliku tekstowego
Forum PHP.pl > Forum > PHP
jarmiar
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
Fifi209
No dobra a gdzie problem? smile.gif
Tutaj jest pomoc a nie gotowe rozwiązania.
wookieb
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ą.
jarmiar
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
wookieb
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
jarmiar
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?
skowron-line
Cytat(jarmiar @ 22.07.2010, 20:42:26 ) *
dobrze kombinuje z modulo?

No pięknie kombinujesz ale po co 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.
wookieb
  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. }
Fifi209
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ć.
jarmiar
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
Fifi209
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...
jarmiar
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
Fifi209
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
jarmiar
wziąłem sobie strimowałem trim() i smiga
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.