Entwickler-Ecke

Dateizugriff - Listen vergleichen mit Ausgabe d. Unteschieds


wurzel - Mi 14.03.07 11:36
Titel: Listen vergleichen mit Ausgabe d. Unteschieds
Hallo.

Hab en Problem, was ich nicht hier in der Suche gefunden habe. Ich habe 2 *.txt-files. In der ersten steht sowas wie

Quelltext
1:
2:
3:
4:
5:
6:
7:
10 03 05 20-2  KB-S 333
10 03 05 20-3  KB-S 333
10 03 05 20-4  KB-S 333
10 03 05 20-5  KB-S 333
10 03 05 20-6  KB-S 333
10 03 05 20-7  KB-S 333
10 03 05 20-8  KB-S 333


in der zweiten

Quelltext
1:
2:
3:
4:
5:
6:
09 06 05 10-1  39
09 06 05 10-8  39
09 06 04 30-1  39
09 06 04 30-2  39
09 06 04 30-5  39
11 07 03 10-5  39


Im ersten File sind die einzelen Zeilen nicht durch ein Tab getrennt.
Im zweiten File ist der erste Block "xx xx xx xx-x" durch ein Tab getrennt vom zweiten Block "xx".

Ich will nun, dass mein Tool sich die ersten Zeichen krallt vom ersten File und das mit dem zweiten File vergleicht. Wenn es einen Treffer landet, dann soll überprüft werden, ob der zweite Block im zweiten File größer als 0 ist.

THX schonmal für eure Hilfe


Martin1966 - Mi 14.03.07 12:44
Titel: Re: Listen vergleichen mit Ausgabe d. Unteschieds
user profile iconwurzel hat folgendes geschrieben:
Ich will nun, dass mein Tool sich die ersten Zeichen krallt vom ersten File und das mit dem zweiten File vergleicht.

Das solltest du wohl etwas näher beschreiben. Vielleicht auch mal ein Beispiel zeigen.


wurzel - Do 15.03.07 08:03

Als Anhang ein Struktogramm


wurzel - Do 15.03.07 09:24

Hier noch mein bisheriger Quellcode


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
var
  Form1: TForm1;
  liste_1 : TStringlist;
  liste_2 : TStringlist;
  count_l1 : Integer;
  count_l2 : Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Liste_1 := TStringlist.Create;
  Listbox1.Items.LoadFromFile('liste_1.txt');
  Listbox2.Items.LoadFromFile('liste_2.txt');
  count_l1 := Listbox1.Items.Count;
  count_l2 := Listbox2.Items.Count;
  Label7.Caption := 'Einträge: ' + IntToStr(count_l1);
  Label8.Caption := 'Einträge: ' + IntToStr(count_l2);
end;

procedure TForm1.Button2Click(Sender: TObject);
var i,count : Integer;
count_i : Integer;
count_k : Integer;

begin
  count_i := 0;
  count_k := 0;
  
  repeat
    if Listbox1.Items.ValueFromIndex[count_i] = Listbox2.Items.ValueFromIndex[count_k] then
      begin
//        Listbox3.Assign(Listbox1);
        count_k := count_k + 1;
      end;
    count_i := count_i + 1;

  until (count_k = count_l2);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := 'CMS 6000 - Fehlende Abrechnungen';
  Label1.Caption := 'Fehlende Abrechnungen???';
  Label2.Caption := 'Liste Kiwi';
  Label3.Caption := 'Liste CMS';
  Label4.Caption := 'Fehlende Abrechnungen';
  Label5.Caption := 'Abrechungen zuviel';
  Label6.Caption := Chr(169) + ' by wurzel';
  Label7.Caption := 'Einträge:';
  Label8.Caption := 'Einträge:';
  Button1.Caption := 'Laden';
  Button2.Caption := 'Suchen';
end;

end.


wurzel - Do 15.03.07 10:36

Bitte helft mir :(


wurzel - Do 15.03.07 10:48

Neue Procedure, aber der Suchfilter ist zu stark. Wie kann ich das machen, dass er nur die ersten 8 Zeichen suchen soll?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button2Click(Sender: TObject);
var i,count : Integer;
count_i : Integer;
count_k : Integer;

begin
  count_i := 0;
  count_k := 0;
  
  repeat
    if Pos(Listbox1.Items[count_i],ListBox2.Items.Text) = 0 then
      begin
        Listbox3.Items.Add(Listbox1.Items.ValueFromIndex[count_i]);
//        Listbox3.Assign(Listbox1);
        count_k := count_k + 1;
      end;
    count_i := count_i + 1;

  until (count_k = count_l2);
end;


IngoD7 - Do 15.03.07 11:56

user profile iconwurzel hat folgendes geschrieben:
Neue Procedure, aber der Suchfilter ist zu stark. Wie kann ich das machen, dass er nur die ersten 8 Zeichen suchen soll?


LeftStr()


wurzel - Do 15.03.07 12:15

Procedure geupdatet


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
procedure TForm1.Button2Click(Sender: TObject);
var i,count : Integer;
count_i : Integer;
count_k : Integer;
count_f : Integer;
acht : String;

begin
  count_i := 0;
  count_k := 0;
  count_f := 0;
  repeat
//    acht := LeftStr(Listbox1.Items.ValueFromIndex[count_i],13);
    if Pos(LeftStr(Listbox1.Items.ValueFromIndex[count_i],13),ListBox2.Items.Text) = 0 then
      begin
        Listbox3.Items.Add(Listbox1.Items.ValueFromIndex[count_i]);
        count_k := count_k + 1;
      end
    else
      if Pos(Listbox1.Items[count_i],'*frei*') = 0 then
        begin
          count_f := count_f + 1;
          Label11.Caption := 'Freie Einträge: ' + IntToStr(count_f);
        end
      else      
      Listbox4.Items.Add(Listbox1.Items.ValueFromIndex[count_i]);
    count_i := count_i + 1;
  until (count_i = count_l1);
  count_l3 := Listbox3.Items.Count;
  count_l4 := Listbox4.Items.Count;
  Label9.Caption := 'Einträge: ' + IntToStr(count_l3);
  Label10.Caption := 'Einträge: ' + IntToStr(count_l4);
end;


wurzel - Do 15.03.07 14:08

Cool, thx, das klappt schonmal. Nun bekomme ich aber in einer meiner Listboxen nicht "frei", sondern "rei" angezeigt. Ist ärgerlich, weil ich nach dem Begriff "frei" suche und dann löschen will. Woran liegts?


IngoD7 - Do 15.03.07 14:48

Wer soll das verstehen/wissen?

Es taucht in deinem Codeschnipsel nirgendwo "frei" auf, sondern höchstens "*frei*".
Auch ist die Verwendung von ValueFromIndex zweifelhaft. Welchen Separator zwischen Name und Wert benutzt du überhaupt?

Zudem kann es ja nicht so schwer sein, zu sagen in welcher Listbox irgendwas unerwartetes geschieht.


wurzel - Do 15.03.07 15:03

Ist garnicht schwer zu verstehen.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
var
  Form1: TForm1;
  liste_1 : TStringlist;
  liste_2 : TStringlist;
  count_l1 : Integer;
  count_l2 : Integer;
  count_l3 : Integer;
  count_l4 : Integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Liste_1 := TStringlist.Create;
  Listbox1.Items.LoadFromFile('liste_1.txt');
  Listbox2.Items.LoadFromFile('liste_2.txt');
  count_l1 := Listbox1.Items.Count;
  count_l2 := Listbox2.Items.Count;
  Label7.Caption := 'Einträge: ' + IntToStr(count_l1);
  Label8.Caption := 'Einträge: ' + IntToStr(count_l2);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
count_i : Integer;

begin
  count_i := 0;
  repeat
      if Pos(LeftStr(Listbox1.Items.ValueFromIndex[count_i],12),ListBox2.Items.Text) = 0 then
        begin
          Listbox3.Items.Add(Listbox1.Items.ValueFromIndex[count_i]);
        end
      else
        begin
          Listbox4.Items.Add(Listbox1.Items.ValueFromIndex[count_i]);
        end;
    ListBox4.Items.Delete(ListBox4.Items.IndexOf('rei'));    // rei weil der erste Buchstabe verschluckt wird, ist eig. frei
    count_i := count_i + 1;
  until (count_i = count_l1);
  count_l3 := Listbox3.Items.Count;
  count_l4 := Listbox4.Items.Count;
  Label9.Caption := 'Einträge: ' + IntToStr(count_l3);
  Label10.Caption := 'Einträge: ' + IntToStr(count_l4);
end;



procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := 'CMS 6000 - Fehlende Abrechnungen';
  Label1.Caption := 'Fehlende Abrechnungen???';
  Label2.Caption := 'Liste Kiwi';
  Label3.Caption := 'Liste CMS';
  Label4.Caption := 'Fehlende Abrechnungen';
  Label5.Caption := 'Abrechungen zuviel';
  Label6.Caption := Chr(169) + ' by wurzel';
  Label7.Caption := 'Einträge:';
  Label8.Caption := 'Einträge:';
  Label9.Caption := 'Einträge:';
  Label10.Caption := 'Einträge:';
  Label11.Caption := 'Freie Einträge: ';
  Button1.Caption := 'Laden';
  Button2.Caption := 'Suchen';
  Button3.Caption := 'Abbrechen';
end;

end.


wurzel - Do 15.03.07 15:19

So, jetzt die Vergleich-Prozedur Schritt für Schritt:


Delphi-Quelltext
1:
2:
repeat
  if Pos(LeftStr(Listbox1.Items.ValueFromIndex[count_i],12),ListBox2.Items.Text = 0 then

===> Von dem Wert i in der 1. Listbox werden die ersten 12 Zeichen genommen, und mit der 2. kompletten Listbox verglichen


Delphi-Quelltext
1:
2:
3:
        begin
          Listbox3.Items.Add(Listbox1.Items.ValueFromIndex[count_i]);
        end

===> Falls keine Übereinstimmung da ist ( = 0 ), dann wird der Wert i aus der 1. Listbox in Listbox 3 geschrieben


Delphi-Quelltext
1:
2:
3:
4:
      else
        begin
          Listbox4.Items.Add(Listbox1.Items.ValueFromIndex[count_i]);
        end;

===> Ansonsten wird der Wert i aus der 1. Listbox in die 4. Listbox geschrieben.


Delphi-Quelltext
1:
   ListBox4.Items.Delete(ListBox4.Items.IndexOf('rei'));    // rei weil der erste Buchstabe verschluckt wird, ist eig. frei                    

===> Hier wird in der 4. Listbox alles gelöscht, wo "rei" drinne steht, was eigentlich frei sein soll


Delphi-Quelltext
1:
2:
    count_i := count_i + 1;
  until (count_i = count_l1);

===> Hier wird der count_i bei jedem Aufruf um 1 erhöht. Die ganze Schleife geht solange, bis count_i so groß ist wie die erste Listbox lang ist.


IngoD7 - Do 15.03.07 15:36

Deinen Code würde jeder verstehen, wenn der, der hier im Thread steht auch der wäre, worauf deine Postings sich beziehen. Das war zum Zeitpunkt meines Vorpostings definitv nicht der Fall.

Apropos Vorposting: Was ist mit meiner Frage zu ValueFromIndex?
Willst du sie noch beantworten oder besser (meine Empfehlung!) gleich auf ValueFromIndex verzichten?
Ich denke, du weißt nicht so wirklich, was du damit machst. Die Nutzung dieser Eigenschaft von TStrings.Items (anstatt TStrings.Items direkt zu benutzen) raubt dir auch deine Zeichen.


wurzel - Do 15.03.07 15:43

Ich hab ValueFromIndex benutzt, weil es mir am logischsten schien und es auch eig ganz gut funzt. Aber erklär mir mal was du meisnt mit TStrings.Item. Mach mir bitte mal en Vorschlag :(


wurzel - Do 15.03.07 15:49

Habs jetzt mit TStringlist


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Liste_1 := TStringlist.Create;
  Liste_2 := TStringlist.Create;
  Liste_1.LoadFromFile('liste_1.txt');
  Liste_2.LoadFromFile('liste_2.txt');
  Listbox1.Items.LoadFromFile('liste_1.txt');
  Listbox2.Items.LoadFromFile('liste_2.txt');
  count_l1 := Listbox1.Items.Count;
  count_l2 := Listbox2.Items.Count;
  Label7.Caption := 'Einträge: ' + IntToStr(count_l1);
  Label8.Caption := 'Einträge: ' + IntToStr(count_l2);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
count_i : Integer;

begin
  count_i := 0;
  repeat
      if Pos(LeftStr(Liste_1.Strings[count_i],12),Liste_2.Text) = 0 then
        begin
          Listbox3.Items.Add(Liste_1.Strings[count_i]);
        end
      else
        begin
          Listbox4.Items.Add(Liste_1.Strings[count_i]);
        end;
    ListBox4.Items.Delete(ListBox4.Items.IndexOf('rei'));    // rei weil der erste Buchstabe verschluckt wird, ist eig. frei
    count_i := count_i + 1;
  until (count_i = count_l1);
  count_l3 := Listbox3.Items.Count;
  count_l4 := Listbox4.Items.Count;
  Label9.Caption := 'Einträge: ' + IntToStr(count_l3);
  Label10.Caption := 'Einträge: ' + IntToStr(count_l4);
end;


wurzel - Do 15.03.07 15:49

Juhu,es funzt, du bist ein Schatz :D

Und es ist jetzt sackschnell, nicht wie vorher ^^


IngoD7 - Do 15.03.07 16:49

user profile iconwurzel hat folgendes geschrieben:
Ich hab ValueFromIndex benutzt, weil es mir am logischsten schien und es auch eig ganz gut funzt.

Weißt du denn wirklich, was ValueFromIndex macht??? Normalerweise benutzt man es, um aus 'Ingo=toll' das 'toll' herauszubekommen. Sowas in der Art hast du doch gar nicht als Ausgangslage in deinen zu untersuchenden Texten.
Lies mal die Online-Hilfe zu TListbox.Items.ValueFromIndex, damit dir das nicht nochmal passiert.

user profile iconwurzel hat folgendes geschrieben:
Aber erklär mir mal was du meisnt mit TStrings.Item.

Gar nichts. Das war im Augenblick geistiger Umnachtung geschrieben. Ich meinte TListbox.Items. :oops:
Ausdrücken wollte ich, dass du den Inhalt der Items direkt verarbeitest sollst, ohne das blöde ValueFromIndex. So machst du's jetzt aber ja auch.

user profile iconwurzel hat folgendes geschrieben:
Juhu,es funzt,

Zeigt deine Listbox4 jetzt auch die richtigen Wörter an oder fehlen immer noch Zeichen?


wurzel - Do 15.03.07 17:39

Jo, wie oben im QT zu sehen ist. Ich arbeite nun mit TStringlist. Das klappt auch wunderbar. Jetzt hab ich zwar en anderes Problem, aber ich such erstmal. Und in der Listbox 4 funzt jetzt alles.