Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Porównanie 2 dużych plików tekstowych.
Forum PHP.pl > Forum > PHP
robroy83
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ł.
Pilsener
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.
Fifi209
Jeżeli wystarczy Ci informacja czy są takie same czy nie:
md5_file
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.