Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Porównanie 2 dużych plików tekstowych.
robroy83
post 20.07.2010, 12:00:16
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 20.07.2010

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


Cześć wszystkim.

Chciałbym wykorzystać PHP do stworzenia skryptu do porównania dwóch plików tekstowych o rozmiarze ~kilkaset MB każdy z linii komend. Struktura obydwu jest mniej więcej taka:

^L
RekordA

PoleA1 WartośćA1
PoleA2 WartośćA2
PoleA3 WartośćA3

^L

^L
RekordB

PoleB1 WartośćB1
PoleB2 WartośćB2
PoleB3 WartośćB3

^L

...

Znak "^L" to Form Feed (0c hex).

Kolejność "rekordów" (w powyższym przykładzie są 2: zielony i niebieski, oddzielone ^L^L) jest zmienna w obydwu plikach.

Wstępnie zarys tematu widzę tak, że mógłbym:
- wczytać obydwa pliki do pamięci RAM do dwóch odrębnych tablic, których poszczególne elementy będą zawierały "rekordy" (dane od ^L do ^L);
- porównać potem poszczególne elementy powyższych tablic ("rekordy").

Pytania:
1) Nie wiem w jaki sposób podzielić wspomniane pliki danych na kawałki pod względem elementu ^L. Mógłby ktoś podpowiedzieć rozwiązanie?
2) Czym najlepiej było by porównywać "rekordy"? Chodzi o porównanie znak po znaku (linijka po linijce) danych tekstowych, zastanawiam się nad użyciem polecenia Unix diff...
3) Jakie problemy ewentualnie mogą być związane z wczytywanie tak dużych (~kilkaset MB) plików do RAM-u?

Dzięki za wszelką pomoc winksmiley.jpg

Pozdrawiam,
Rafał.
Go to the top of the page
+Quote Post
Pilsener
post 20.07.2010, 12:45:01
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Cytat
Chciałbym wykorzystać PHP do stworzenia skryptu do porównania dwóch plików tekstowych o rozmiarze ~kilkaset MB każdy z linii komend
- kiepski pomysł.
Cytat
wczytać obydwa pliki do pamięci RAM do dwóch odrębnych tablic
- pomysł jeszcze gorszy.

Należy parsować plik linia po linii i po wczytaniu każdej linii przesuwać wskaźnik do następnej:
  1. $uchwyt = fopen($pliczek,'r');
  2. while(!feof($uchwyt)){
  3. if(fgets($uchwyt)){
  4. $ile_rekordow++;
  5. }
  6. }
  7. fclose($uchwyt);
  8. echo $ile_rekordow;


Zakładam, że porównanie będzie n linia z 1 pliku == n linia z 2 pliku? Można zbudować bardziej skomplikowany algorytm w zależności od potrzeb. Podpowiem też, że funkcja fgets pobiera linię z pliku i przesuwa wskaźnik pliku do następnej linii.
Go to the top of the page
+Quote Post
Fifi209
post 20.07.2010, 13:09:35
Post #3





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

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


Jeżeli wystarczy Ci informacja czy są takie same czy nie:
md5_file


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

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: 17.06.2025 - 01:24