prównywanie DUŻYCH plików...

0

Mam problem ponieważ muszę porównać dwa pliki: plik_1.txt i plik_2.txt. Oba pliki to export tabeli z bazy danych w dość dziwnym formacie. Każdy wiersz składa się z 19 pól oddzielonych znakiem '@':

pole_1@pole_2@pole_3   @pole_4   @ [...] @pole_18@pole_19@

przyczym pole_3 to 5 znakowy numer klienta a pole_17 to jego NIP.
W pliku plik_1.txt jest około 7 500 lini a w pliku plik_2.txt jest około 7 250 lini (ilość lini w plikach ulega zmianie).

Teraz muszę prównać obydwa pliki sprawdzając czy pola pole_3 oraz pole_17 są takie same, tzn czy klient zapisany w plik plik_1.txt maten sam numer klienta i NIP w pliku plik_2.txt.

Głównie chodzi o sprawdzenie czy numer klienta i jego NIP satakie same w obydwu plikach, czyli: wczytuje pliki wybiera pola pole_3 i pole_17 porównuje a róznice wyświetla...

Użyłem tej f-cji do rozdzielenia pojedyńczych linijekale okazało się, że braknie mi pamięci jesli chcę obydwa pliki podzielic i porównać.

Męczę się z tym od tygodnia, więc wszelkie rady, pomoc, wskazówki bardzo mile widziane...

0

może zrób tak:

  1. otwierasz plik przez standardowe Assign, Reset
  2. pobierasz linijkę i wypakowywujesz z niej tylko pole_3 i pole_17
  3. dodajesz je do TStringList w formacie pole_3 + ' ' + pole_17
  4. i tak cały plik
  5. z drugim robisz to samo tylk do innej TStringList

oba TStringList powinny mieć ustawione Sorted := True;

teraz lecąc po indeksach pierwszego sprawdzasz, czy

if sl2.Find(sl1[i], nr) then
  begin
  if sl1[i] = sl2[nr] then
    //taki sam
  else
    //inny
  end
  else
    //w sl2 nie ma tego z sl1
0

A ja uważam, że do porównania wszystkich plików, niezależnie od tego, czy to są pliki baz danych, czy nie, powinno odczytywać się zbór danych z pliku 1, potem z pliku 2 i potem porównać obie wielkości:

function Porownaj: boolean;
var F1,F2:file;
      buf: array [0..4095] of byte;
      buf2: array [0..4095] of byte;
begin
     AssignFile(F1, 'plika.xyz');
     AssignFile(F2, 'plikb.xyz');
     Reset(F1,1);
     Reset(F2,1);
     Result:=True;
     if FileSize(F1)<>FileSize(F2) then
        begin
            Result:=False;
            Exit;  {jeżeli wielkości są różne, to nie ma sensu pracować, tylko od razu wywalić wynik FALSE}
        end;
     while not EOF(F1) do
      begin
          FillChar(buf,SizeOf(buf),0); {Aby żadne śmiecie nie zostały w razie odczytania <4kB}
          FillChar(buf2,SizeOf(buf2),0); {j.w}
          BlockRead(F1,buf,SizeOf(buf));
          BlockRead(F2,buf2,SizeOf(buf2)); 
          if buf<>buf2 then begin
             Result:=False;
             Exit; {Porażka, bufory są różne}
          end;
      end;
end;

Jeżeli są jakieś błędy, to przepraszam - nie pisałem tego w kompilatorze. Algorytm ów działa, sam sprawdziłem, mając podobną potrzebę. Jednak kod programu pisałem z pamięci.

0

Tak? To teraz mi powiedz jak się ma to

SeaSoft napisał(a)

A ja uważam, że do porównania wszystkich plików, niezależnie od tego, czy to są pliki baz danych, czy nie, powinno odczytywać się zbór danych z pliku 1, potem z pliku 2 i potem porównać obie wielkości:

do tego

angel2953 napisał(a)

Każdy wiersz składa się z 19 pól oddzielonych znakiem '@':
pole_1@pole_2@pole_3 @pole_4 @ [...] @pole_18@pole_19@
Teraz muszę prównać obydwa pliki sprawdzając czy pola pole_3 oraz pole_17 są takie same, tzn czy klient zapisany w plik plik_1.txt maten sam numer klienta i NIP w pliku plik_2.txt.

0

Napisany przeze mnie algorytm służy do porównywania KAŻDEGO typu plików. angel napisał, że chce porównać dwa pliki będące eksportem z bazy danych. Jeżeli te pliki z założenia mogą być różne (choć rekordy może mieć takie same), to ten algorytm rzeczywiście się nie sprawdzi.

0

nie powiedział (napisał)

angel2953 napisał(a)

Każdy wiersz składa się z 19 pól oddzielonych znakiem '@':
pole_1@pole_2@pole_3 @pole_4 @ [...] @pole_18@pole_19@
Teraz muszę prównać obydwa pliki sprawdzając czy pola pole_3 oraz pole_17 są takie same, tzn czy klient zapisany w plik plik_1.txt maten sam numer klienta i NIP w pliku plik_2.txt.

czyli nigdzie nie jest napisane, ŻE INNE POLA MUSZĄ BYĆ TAKIE SAME

0

Dobra, nie krzycz 8-O . Sugerowałem się głównie tytułem wątku i cytatem:

Mam problem ponieważ muszę porównać dwa pliki: plik_1.txt i plik_2.txt. (...)

Pomyślałem, że mój program mógłby być przydatny - nie sugerowałem, że na pewno.

0

Nie wszystkie pola się różniąjest chyba 5 stałych pól które zawsze zawierają ten sam typ danych, no i na podstawie dwóch znich muszę sprawdzić czy pliki się róźnią... Jakoś nie potrafię wymyślić algorytmu, który by się tym zajął...

Już nawet próbowałem porównywać tylko te dwa pola, w plikach znajdowały się tylko one i każdy wiersz miał postać:
pole_3@pole_17
ale jakoś to nie tak działało jak powinno... :/

Czy ktośmoże ma jakiś pomysł jak się do tego zabrać ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1