Autor |
Beitrag |
LuckyStrike4life
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mo 08.09.03 14:49
Morgen,
ja mit dem Titel hab ich mich schwer getan, denn mein Problem ist nicht mit einer Zeile zu erklären.
Daher mach ich dies jetzt:
Ich hab die Aufgabe, ein Programm zu entwickeln - welches Datenbankinhalte aufnimmt, abgleicht und diese Informationen an die richtige Datenbank anpasst.
Aber damit kann ich noch nicht beginnen, erstmal muss ich aus einer Datenbank ermitteln, wie oft ein bestimmter Wert verwendet wurde. Ich poste mal ein Auszug aus der Datenbank:
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:
| 000151000101200312030037200 102301a010020000001[b]001[/b]00173002 03 000 202301a0109699 332301a0111102100 342301a011001100 000 402301a0110200 071 0063 280 1010 305 00010 02 0060 006 402301a0110300 060 0050 190 1310 305 00040 02 0070 006 402301a0110400 080 0050 190 1320 305 00027 02 0060 006 402301a0110500 011 0061 230 1310 305 00020 02 0030 006 402301a0110100 080 0071 280 1014 305 00076 02 0070 006 102301a020020000001[b]001[/b]00118002 03 000 202301a0209699 332301a0211102100 342301a021001100 000 402301a0210100 080 0063 260 1215 305 00044 0201 0070 006 402301a0210200 011 0060 230 1210 305 00030 0201 0070 006 402301a0210300 032 0060 260 1210 405 00014 0201 0090 006 402301a0210400 060 0048 200 1001 305 00015 0201 0040 006 402301a0210500 091 0063 260 1230 305 00015 0201 0050 006 102301a030020000001[b]001[/b]00669002 03 000 202301a0309699 332301a0311102100 342301a031001100 000 402301a0310100 020 0063 250 1301 302 00210 0201 0095 006 402301a0310402 020 0011 1010 301 00100 402301a0310200 071 0063 270 1310 302 00210 0201 0050 006 402301a0310300 011 0063 230 1010 302 00249 0201 0040 006 102301a040020000001[b]001[/b]00264002 03 000 202301a0409699 332301a0411102100 342301a041001100 000 402301a0410100 020 0163 300 1128 302 00092 13 030007 402301a0410200 011 0163 310 1114 302 00081 13 030007 402301a0410300 021 0163 290 1130 501 00053 13 030007 402301a0410400 031 0063 250 1411 301 00038 02 0095 502301a04102021 011035004 502301a04103021 021030004 502301a0410102100068 020035004 01 802301a041Wenn erforderlich Kulturgatter anlegen. 102301a050020000001[b]001[/b]00457002 03 000 202301a0509699 332301a0511102100 342301a051001100 010 402301a0510400 031 0087 290 1210 301 00055 02 0080 006 402301a0510100 020 0086 310 1004 302 00352 02 0065 006 402301a0510200 011 0086 280 1010 302 00040 02 0030 006 402301a0510300 041 0082 280 1006 301 00010 093 |
Wichtig ist der Wert, in diesem Beispiel immer "001", den ich versucht habe fett auszugeben, was aber wohl durch die Deklaration "Code" nichts wird.
Dieser Wert muss automatisch gefunden und notiert werden.
Es ist möglich dem Programm zu sagen welche Zeilen relevant sind, dass sind immer nur die, die mit einer "10" beginnen und der Wert beginnt immer an der 19en Stelle und endet an der 22en Stelle.
Hat jemand eine Idee wie man so ein Programm angehen kann? Wäre sehr wichtig, ansonsten liegt die Sache weiterhin auf Eis... .
_________________ ... ich kann doch nichts ...
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mo 08.09.03 15:39
Hallo,
Du gehst halt in einer Schleife die einzelnen Zeilen durch und prüfst ob diese mit 10 anfangen:
Delphi-Quelltext 1:
| If Copy (Str, 1, 2) = '10' Then |
Wenn diese mit 10 anfangen dann kannst wiederum mit Copy prüfen ob an der 19 Stelle 001 steht.
Gruß
Tino
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Di 09.09.03 09:05
Das hört sich ja schon mal gut an,
aber wie bekomme ich das Programm dazu, diesen Text denn auch auf die Datei anzuwenden? Muss ich dafür die Daten laden lassen? Also, zum Beispiel eine Menüleiste erstellen, mit der Funktion zum laden von txt Datein?
_________________ ... ich kann doch nichts ...
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Di 09.09.03 09:58
Hallo!
LuckyStrike4life hat folgendes geschrieben: | Muss ich dafür die Daten laden lassen? |
Natürlich. Wenn du mit dem Text arbeiten möchtest musst du den irgendwie "laden". Vielleicht so:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Var SL: tStringList; Begin SL := tStringList.Create; Try SL.LoadFromFile ('c:\logfile.txt'); Finally SL.Free; End; End; |
LuckyStrike4life hat folgendes geschrieben: | Also, zum Beispiel eine Menüleiste erstellen, mit der Funktion zum laden von txt Datein? |
Das weiß ich doch nicht wie du dein Programm aufbauen willst. Das musst du schon selbst entscheiden und dann auch programmieren.
Gruß
Tino
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Di 09.09.03 10:33
Danke,
werd das dann jetzt mal so probieren. Kommen aber sicher noch ein paar Fragen  .
Ich bezieh mich mal ganz auf meine Signatur.
_________________ ... ich kann doch nichts ...
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Di 09.09.03 10:55
Das mag irgendwie noch nicht so ganz, hab deinen Code mal auf eine ButtonClick Funktion gelegt:
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:
| unit MainFormpas;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TMainForm = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private public end;
var MainForm: TMainForm; Var SL: tStringList;
implementation
{$R *.DFM}
procedure TMainForm.Button1Click(Sender: TObject); begin Begin SL := tStringList.Create; Try SL.LoadFromFile ('c:\logfile.txt'); If Copy (Str, 1, 2) = '10' Then test1.show; Finally SL.Free; End; End; end;
end. |
So wie es jetzt steht kanns sicher auch noch nicht funktionieren, aber Delphi mag noch nicht mal compilieren.
Bei "If Copy (Str, 1, 2) = '10' Then" meint Delphi
Zitat: | [Fehler] MainFormpas.pas(34): '(' erwartet, aber ',' gefunden
[Fehler] MainFormpas.pas(34): Inkompatible Typen |
.
Was íst denn falsch?
_________________ ... ich kann doch nichts ...
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Di 09.09.03 12:39
Hallo,
es sollte besser so heißen
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TMainForm.Button1Click(Sender: TObject); Begin SL := tStringList.Create; Try SL.LoadFromFile ('c:\logfile.txt'); If Copy (Sl[0], 1, 2) = '10' Then begin test1.show; end; Finally SL.Free; End; end; |
das ganze geraffel mit copy solltest du noch in eine for schleife packen und dann kannst du die ganze liste abarbeiten.
Gruß
Ken[/delphi]
_________________ Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Di 09.09.03 13:09
Danke dir,
das bringt mich schon ein Stück weiter.
_________________ ... ich kann doch nichts ...
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Di 09.09.03 14:40
Hallo!
Außerdem würde ich dir empfehlen dir die Grundlagen von Delphi (Pascal [Delphi-Language]) anzueignen. Ohne diese ist es viel zu schwierig vernünftig weiter zu arbeiten.
Hier ein Seite die ich dir emfehlen kann: Marco Cantù's Essential Pascal (deutsch)!
Gruß
Tino
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mi 10.09.03 09:46
Morgen,
naja - n wenig Grundwissen sollte ich schon haben, also ich bin zumindest nicht der absolute Anfänger. Natürlich reicht es nicht aus um zu sagen das ich Delphi könnte, aber vielleicht ansatzweise. Den Link werd ich aber sicher trotzdem gut verwenden können, Danke.
Ich hab jetzt den letzten Code der von CenBells kam ordentlich getestet und er funktioniert auch. Allerdings hab ich noch ein paar Fragen dazu.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TMainForm.Button1Click(Sender: TObject); begin SL := tStringList.Create; Try SL.LoadFromFile ('c:\test.txt'); If Copy (Sl[0], 1, 2) = '10' Then begin Application.Terminate; end; Finally SL.Free; End; end; |
Application.Terminate; hab ich eingesetzt um zu überprüfen ob es tatsächlich funktioniert und wie auch schon gesagt - es geht.
Aber was für mich jetzt noch wichtig wäre, wie kann ich dem Programm sagen das es wenn die ersten beiden Zahlen "1" und "0" sind, dass in der gleichen Zeile ab der 19ten Stelle bis zur 22sten Stelle die Zahlen ausgelesen werden müssen und irgendwo hin gespeichert werden. So das der User diese Später auslesen kann.
Da komm ich leider nicht drauf  .
_________________ ... ich kann doch nichts ...
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Mi 10.09.03 10:26
Hallo,
LuckyStrike4life hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TMainForm.Button1Click(Sender: TObject); begin SL := tStringList.Create; Try SL.LoadFromFile ('c:\test.txt'); If Copy (Sl[0], 1, 2) = '10' Then begin Application.Terminate; end; Finally SL.Free; End; end; |
Application.Terminate; hab ich eingesetzt um zu überprüfen ob es tatsächlich funktioniert und wie auch schon gesagt - es geht.
Aber was für mich jetzt noch wichtig wäre, wie kann ich dem Programm sagen das es wenn die ersten beiden Zahlen "1" und "0" sind, dass in der gleichen Zeile ab der 19ten Stelle bis zur 22sten Stelle die Zahlen ausgelesen werden müssen und irgendwo hin gespeichert werden. So das der User diese Später auslesen kann. |
Also, was ist auslesen aus einem string??? Rauskopieren. Das steht doch schon in den hier diskutierten codebeispielen. Wenn du eine zeile mit 10 gefunden hast, musst du also ab stelle 19 drei zechen kopieren (OH: copy).Das machst du also anstelle deines Application.terminate;
Das Abspeichern kann man nicht per default lösung machen:
Du könntest eine kleine Tabelle (DBase, Paradox, etc) erstellen und deine werte dort hinein speichern oder du speicherst deine Werte in eine typisierte datei.
Du musst dir vielleicht erstmal klar werden, wie die speicherung aussehen soll, bevor du dich daran versuchst.
Edit: und wenn du dir den link angeschaut hättest, wäre dir sehr schnell klar geworden, wie man die aufgabe mit dem rauslesen löst. Wahrscheinlich hätte das buch dir auch bei der speicherung geholfen.
Gruß
Ken
_________________ Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mi 10.09.03 10:56
Hallo!
LuckyStrike4life hat folgendes geschrieben: | naja - n wenig Grundwissen sollte ich schon haben, also ich bin zumindest nicht der absolute Anfänger. Natürlich reicht es nicht aus um zu sagen das ich Delphi könnte, aber vielleicht ansatzweise. |
Ich hab dir den Link nur geben weil ich der Meinung war das dir ein wenig grundlegendes Wissen im Bereich Delphi fehtl da du so etwas gecodet hast:
Delphi-Quelltext 1: 2: 3: 4: 5:
| begin begin end; end; |
War von mir auf jeden Fall nicht böse gemeint.
LuckyStrike4life hat folgendes geschrieben: | Ich hab jetzt den letzten Code der von CenBells kam ordentlich getestet und er funktioniert auch. |
Ich hoffe du weißt warum der Code von CenBells (ist übrigends der gleiche Code den ich schon am Anfag des Topics gepostet habe) jetzt funktioniert
Gruß
Tino
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mi 10.09.03 12:34
CenBells hat folgendes geschrieben: |
Wenn du eine zeile mit 10 gefunden hast, musst du also ab stelle 19 drei zechen kopieren (OH: copy).Das machst du also anstelle deines Application.terminate;
Das Abspeichern kann man nicht per default lösung machen:
Du könntest eine kleine Tabelle (DBase, Paradox, etc) erstellen und deine werte dort hinein speichern oder du speicherst deine Werte in eine typisierte datei. |
Ja, an soetwas hab ich gedacht. Das also die Werte gleich in eine Tabelle geschrieben werden, am besten wäre dBase. Soweit auch nicht das Problem, da reichen meine Kentnisse noch bis zum erstellen, verknüpfen usw. .
Aber mir geht nicht ganz auf wie ich denn nun diese neue Zeile angehen muss, wie soll ich dem System sagen das er nach der 19ten stelle 3 Zahlen rauslesen muss und dann diese in die Datenbank zu speichern hat.
Tino hat folgendes geschrieben: | Ich hab dir den Link nur geben weil ich der Meinung war das dir ein wenig grundlegendes Wissen im Bereich Delphi fehtl da du so etwas gecodet hast: [...]
War von mir auf jeden Fall nicht böse gemeint. |
So hab ich es auch nicht aufgefasst. Hab mir eben dort auch noch einiges zu "Strings" durchgelesen, werde diese Seite auch noch stärker nutzen. Da bin ich mir sicher. Nur komisch das ich die nicht gefunden habe, als ich vor einigen Monaten direkt nach solchen Seiten gesucht habe. Nochmals Danke.
_________________ ... ich kann doch nichts ...
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mi 10.09.03 14:15
Hallo,
LuckyStrike4life hat folgendes geschrieben: | wie soll ich dem System sagen das er nach der 19ten stelle 3 Zahlen rauslesen muss |
In dem Beispiel Code den ich dir gepostet habe steht unter anderem diese Zeile:
Delphi-Quelltext 1:
| If Copy (Sl[0], 1, 2) = '10' Then begin |
Schau dir diese mal etwas genauer an. Hier prüfe ich ob bei dem String (den ich durch Sl[0] angegeben habe) die ersten zwei Zeichen gleich 10 ist. Jetzt müsste es doch kein Problem sein die Zeile zu kopieren und so um zu schreiben das diese nun prüft ob die 3 Zeichen ab der 19. Stelle gleich 001 ist.
Gruß
Tino
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mi 10.09.03 14:53
Moderiert von Tino: Beitrag versehentlich gelöscht. Sorry
_________________ ... ich kann doch nichts ...
|
|
StefanH
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Mi 10.09.03 15:47
Copy erwartet, den String, ind dem das passiert, dann wo es anfangen soll zu kopieren, und dann wieviele Zeichen es kopieren soll.
Also:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| SL := tStringList.Create; Try SL.LoadFromFile ('c:\test.txt'); If Copy (Sl[0], 1, 2) = '10' Then begin If Copy (Sl[0], 19, 3) = '001' then begin application.terminate;
end; end; Finally SL.Free; end; |
Verstanden?
Stefan
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: Mi 10.09.03 16:34
Hallo,
Luckystrike4life will nicht überprüfen, ob die 3 zeichen ab dem 19 gleich 001 sind. Er will das einfach nur rauskopieren und dann abspeichern. Also etwa so
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if copy(sl[0], 1, 2) = '10' then begin gesuchterWert := copy(sl[0], 19, 3); end; |
Gruß
Ken
_________________ Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
|
|
Tino
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Mi 10.09.03 17:39
Hier der Beitrag den ich vor ca. 2 Stunden versehentlich in LuckyStrike4life´s Beitrag reingepostet habe:
Tino hat folgendes geschrieben: | Zitat: | für mich wäre es besser wenn das Programm die 3 Zeichen ab der 19ten stelle einfach kopiert, als das ich diese Abfrage. |
Na dann entferne die 2. If-Then-Abfrage und pack das Ergebnis von Copy (ist ja schließlich eine Funktion die einen String zurück gibt) in einer Variable und fertig. Was du dann mit dem Wert machst, ob in einer Textdatei schreiben oder in einer Datenbank oder so, ist eine andere Frage... und somit auch ein neues Topic
Gruß
Tino |
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Do 11.09.03 09:28
CenBells hat folgendes geschrieben: | Hallo,
Luckystrike4life will nicht überprüfen, ob die 3 zeichen ab dem 19 gleich 001 sind. Er will das einfach nur rauskopieren und dann abspeichern. Also etwa so
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| if copy(sl[0], 1, 2) = '10' then begin gesuchterWert := copy(sl[0], 19, 3); end; |
Gruß
Ken |
Morgen,
das hört sich doch schon sehr gut an. Es sieht jetzt so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TMainForm.Button1Click(Sender: TObject); begin SL := tStringList.Create; Try SL.LoadFromFile ('c:\test.txt'); If Copy (Sl[0], 1, 2) = '10' Then begin gesuchterWert := copy(sl[0], 19, 3); TableMain.edit; TableMain.Append; TableMain.FieldByName('relev').AsString := gesuchterWert; TableMain.Post; end; end; end; Finally SL.Free; end; end; |
Aber "gesuchterWert" ist natürlich noch nicht definiert und ich weiß nicht als was ich es definieren soll.
Zitat: | [Fehler] MainFormpas.pas(37): Undefinierter Bezeichner: 'gesuchterWert' |
Wenn ihr mir das noch verraten könntet ...  .
_________________ ... ich kann doch nichts ...
|
|
JustusJonas
      
Beiträge: 222
|
Verfasst: Do 11.09.03 09:42
Vielleicht solltest du dir lieber Mal ein Buch über Delphi durchlesen!
Ist wirklich nicht böse gemeint, jeder hat ja mal klein angefangen, aber so ganz ohne Fachliteratur ist das halt schwierig.
Zumindest sollte man doch schon wissen, wie man Variablen deklariert.
Und das ist auch genau der Fehler bei deinem Programm.
Delphi weiß ja überhaupt nicht was "gesuchterWert" eigentlich ist. Also kann es da auch nix reinschreiben.
Du musst Delphi sagen, dass es sich bei "gesuchterWert" um einen String handelt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure TMainForm.Button1Click(Sender: TObject); var gesuchterWert : string; begin SL := tStringList.Create; Try SL.LoadFromFile ('c:\test.txt'); If Copy (Sl[0], 1, 2) = '10' Then begin gesuchterWert := copy(sl[0], 19, 3); TableMain.edit; TableMain.Append; TableMain.FieldByName('relev').AsString := gesuchterWert; TableMain.Post; end; end; end; Finally SL.Free; end; end; |
Greetz
|
|