jarmiar
22.07.2010, 21:13:56
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
22.07.2010, 21:20:31
No dobra a gdzie problem?

Tutaj jest pomoc a nie gotowe rozwiązania.
wookieb
22.07.2010, 21:21:30
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
22.07.2010, 21:37:07
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
22.07.2010, 21:40:49
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
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?
skowron-line
22.07.2010, 21:46:00
Cytat(jarmiar @ 22.07.2010, 20:42:26 )

dobrze kombinuje z modulo?
No pięknie kombinujesz ale po co

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
22.07.2010, 21:48:15
$ileLinii = 200;
for($i=0; $i<$length; $i++)
{
$part = floor($i/$ileLinii) + 1; // numer parta }
Wersja z modulo
$ileLinii = 200;
$part = 1;
for($i=0; $i<$length; $i++)
{
if (($i%$ileLinii) == 0) $part++;
}
Fifi209
22.07.2010, 21:49:11
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:
<?php
$file = fopen('test.txt', 'r');
$x=1;
$temp[] = fgets($file, 100
); if (count($temp) == 200) { file_put_contents
('part_'.$x.'.txt', implode("\n", $temp)); $x++;
}
}
?>
ale nie wiem czy działa bo nie mogę przetestować.
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
Fifi209
22.07.2010, 21:54:00
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
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
Fifi209
22.07.2010, 22:00:11
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
22.07.2010, 22:15:16
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.