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
wurzel 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 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]); count_k := count_k + 1; end; count_i := count_i + 1;
until (count_k = count_l2); end; |
IngoD7 - Do 15.03.07 11:56
wurzel 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 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')); 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')); |
===> 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')); 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
wurzel 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.
wurzel 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.
wurzel 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!