Prównywanie dwóch plików tekstowych z wynikiem, tech. dowolna

Szubert
2013-07-19 11:04
Szubert
0

Witam serdecznie. Laik jestem w językach skryptowych czy też programowaniu, ale postaram się problem ukazać w jak najjaśniejszej formie.
Potrzebuje porównać dwa pliki a wynik tego porównania wyprowadzić do trzeciego pliku.
Plik I to lista wg formatu adres email i nazwa użytkownika ma to formę mniej więcej:

[email protected]:nazwa
Plik II to też lista wg fomatu adres email i ranga

[email protected] ranga
Potrzeba jest taka żeby porownać te 2 pliki i na trzecim wyrzucić wszystkie

[email protected]:nazwa=/=mail ranga
Czyli wszystkie adresy email które nie w pliku 2 nie mają przypisanej rangi.

Przykład:

plik1

[email protected]:jan78
[email protected]:nowy5
stachkowalski:kowal666
[email protected]:iwcia8

plik2

[email protected] vip
[email protected] vip

Porównanie wyrzuci do pliku3 tylko

[email protected]:jan78
stachkowalski:kowal666

Technologia jest mi obojętna, może to być javascript, php, jakiś program w c++ czy narzędzia wbudowane w systemy (doszukałem się jakiś awk itp. w linuxowych ale dla kogoś kto w tym nie siedzi, czyli mnie to czarna magia :(.
Żebym sobie poradził i byleby działało, reszta to jeden czort :)

dodanie znaczników + lekki format - fp

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2013-07-19 11:12
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

0

Zapraszam na PW, wykonam za 50 złotych w paręnaście minut w Delphi (lub C++, lub PHP, do wyboru).
Edit: chyba, że prosisz o pomoc - wtedy mogę najwyżej odesłać do książek i podstaw np.Delphi bądź dowolnego innego języka, bo akurat trudny programik to nie jest.
Wystarczy wczytać pierwszy plik oraz usunąć z niego maile znajdujące się w pliku drugim. Voilà!


edytowany 3x, ostatnio: Patryk27, 2013-07-19 11:16

Pozostało 580 znaków

2013-07-19 11:26
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Tuchów

0

Przebijam ofertę - 40zł w Delphi/Pascal - kontakt PW :]


@Szubert</span></b> - jeśli potrzebujesz pomocy w skonstruowaniu takiego programu to pokaż co do tej pory zrobiłeś, a znajdą się chętni do pomocy;

Jeśli natomiast nie masz zamiaru nic sam zrobić (czyli de facto jest to oferta/zlecenie) to wybierz sobie kogoś, kto za godziwą zapłatę wykona to w całości za Ciebie i wszyscy będą zadowoleni;

Więc jeśli jest to zlecenie to napisz to, a wątek przeniesie się do odpowiedniego działu, gdzie znajdziesz chętnych do wykonania tego zlecenia.


edytowany 1x, ostatnio: furious programming, 2013-07-19 11:27

Pozostało 580 znaków

Szubert
2013-07-19 11:44
Szubert
0

Myślałem że to forum i służy do pomocy a nie oferia, haha :D Ale oczywiście: jeśli nikt mi nie pomoże i sobie nie poradzę to będę zmuszony i na pewno skorzystam :) W końcu za prace się płaci.
Tylko że myślałem że złożoność tego jest tak mała że ktoś z palca jak tylko wie napisze to pewnie w 30 sekund bo ma wiedzę której mi brak :/ Nie moja specjalność niestety a życie postawiło mnie właśnie przed takim problemem dlatego szukam pomocy właśnie tu. Szczerze to po raz I próbuje rozwiązać coś z pomocą innych, no ale tym razem problem mnie przerasta.

Trafna uwaga! Doczytałem twój edit i widzisz: wy właśnie myślicie algorytmami którymi przeciętny człowiek nie myśli :)
Faktycznie to jest droga.

Czyli potrzebuje:
wczytać plik 1 tak żeby każda jedna linia była jednym rekordem? zmienną?
Musiałyby być chyba 2 zmienne: jedna to zmienna z całą linią, druga zmienna to email wyluskany z tej lini.
Następnie wczytać plik 2 i także utworzyć 2 zmienne: 1=caly wers, 2=wyłuskanyemail.

Następnie porównać zmienną 2 z pliku 1 czy nie występuje w zmiennych 2 w wersach pliku 2.
Jeśli tak to usunąć ten wers.

Dobrze rozumuje?
Wszystko jedno w czym, chodzi tylko o to żeby funkcjonowało.

fp: dziękuję, będę pamiętał na przyszłość :)

Pozostało 580 znaków

2013-07-19 11:56
Moderator

Rejestracja: 12 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Wrocław

0

Preferowałbym sposób: jedna linia = jeden rekord, ponieważ w jednej linii masz dwie informacje: mail oraz nazwę/rangę. W Pascalu ten rekord prezentowałby się następująco:

Type TFileData = Record
 Mail, Data: String;
End;

Gdzie odpowiednio: Mail to część przed dwukropkiem (lub spacją, w drugim przypadku), a Data to część znajdująca się po nim. Można do tego celu najprościej użyć delfiowych funkcji Pos oraz Copy (Pos wskaże, na której pozycji znajduje się dwukropek/spacja w danym ciągu znaków, a za pomocą Copy wystarczy wyciąć fragment i przypisać do odpowiedniego pola rekordu).
W przypadku pliku pierwszego Data to ofc. będzie nazwa (np.jan78), a w drugim pliku to będzie ranga.

Przypuszczalnie mamy trzy tablice:

File1: Array of TFileData;
File2: Array of TFileData;
OutputFile: Array of TFileData;

Pierwsze dwie zawierają przeparsowane dane z dwóch plików wejściowych (w sposób opisany powyżej); pozostaje nam tylko ręcznie uzupełnić tablicę OutputFile, która będzie tą wynikową. W zasadzie jedyne, co wystarczy zrobić, to do tablicy OutputFile wpisać każdy element z tablicy File1, który nie znajduje się w tablicy File2. Podejście naiwne to będzie coś w rodzaju:

Var I, J: Integer;
    Can: Boolean;
Begin
 SetLength(OutputFile, 0);

 For I := Low(File1) To High(File1) Do
 Begin
  Can := True;

  For J := Low(File2) To High(File2) Do
   if (File1[I].Mail = File2[J].Mail) Then // jeżeli mail znajduje się zarówno w pliku pierwszym jak i drugim, to nie dodajemy go do tablicy wyjściowej
    Can := False;

  if (Can) Then
  Begin
   SetLength(OutputFile, Length(OutputFile)+1);
   OutputFile[High(OutputFile)] := File1[I];
  End;
 End;
End;

Potem pozostaje tylko kwestia zapisu tablicy OutputFile do pliku - ale to już w gruncie rzeczy najłatwiejsza czynność.


edytowany 4x, ostatnio: Patryk27, 2013-07-19 12:00

Pozostało 580 znaków

2013-07-20 18:24

Rejestracja: 8 lat temu

Ostatnio: 1 tydzień temu

Lokalizacja: Łódź

0

nie lepiej:

For I := Low(File1) To High(File1) Do
 Begin
  Can := True;

  For J := Low(File2) To High(File2) Do
   if not (File1[I].Mail = File2[J].Mail) Then // jeżeli mail znajduje się zarówno w pliku pierwszym jak i drugim, to nie dodajemy go do tablicy wyjściowej
   begin
     SetLength(OutputFile, Length(OutputFile)+1);
     OutputFile[High(OutputFile)] := File1[I];
   end;
 End;

jedno porównanie i jedna zmienna mniej :P</del>

Głupoty napisałem sorry.

edytowany 1x, ostatnio: babubabu, 2013-07-20 20:22
ahhh fakt mój błąd. Nie dokładnie przeczytałem kod. - babubabu 2013-07-20 20:22

Pozostało 580 znaków

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