Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> dzielenie pliku tekstowego
jarmiar
post 22.07.2010, 21:13:56
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


--------------------
Jeśli my czegoś nie zrobimy, zrobią to za nas inni
Go to the top of the page
+Quote Post
Fifi209
post 22.07.2010, 21:20:31
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? smile.gif
Tutaj jest pomoc a nie gotowe rozwiązania.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
wookieb
post 22.07.2010, 21:21:30
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 22.07.2010, 21:37:07
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


--------------------
Jeśli my czegoś nie zrobimy, zrobią to za nas inni
Go to the top of the page
+Quote Post
wookieb
post 22.07.2010, 21:40:49
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 22.07.2010, 21:42:26
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?


--------------------
Jeśli my czegoś nie zrobimy, zrobią to za nas inni
Go to the top of the page
+Quote Post
skowron-line
post 22.07.2010, 21:46:00
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 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.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
wookieb
post 22.07.2010, 21:48:15
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 22.07.2010, 21:49:11
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ć.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
jarmiar
post 22.07.2010, 21:52:09
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


--------------------
Jeśli my czegoś nie zrobimy, zrobią to za nas inni
Go to the top of the page
+Quote Post
Fifi209
post 22.07.2010, 21:54:00
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


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
jarmiar
post 22.07.2010, 21:57:08
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


--------------------
Jeśli my czegoś nie zrobimy, zrobią to za nas inni
Go to the top of the page
+Quote Post
Fifi209
post 22.07.2010, 22:00:11
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


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
jarmiar
post 22.07.2010, 22:15:16
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


--------------------
Jeśli my czegoś nie zrobimy, zrobią to za nas inni
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: 23.05.2025 - 07:32