Autor |
Beitrag |
ebs
      
Beiträge: 213
Suse Linux 9.2, Win 98, Win NT, Win XP, Win for Workgroups, Win XP SP2, Dos 6.1
D3 Prof, D2005 PE, Delphi 2006 Prof.
|
Verfasst: So 20.03.05 18:04
Hallo,
ich bin absoluter Anfänger und habe ein Problem mit Dateien. Ich greife mit Delphi auf Textdateien zu, in denen sowohl Strings in Zeilen, als auch zwischen Simikolons stehen. Mein Problem ist, dass Delphi nun immer nur die Spalten als ein String sieht, und niemals die Simikolons. Gibt es irgendeine möglichkeit, dass Delphi auch die Strings zwischen den Simikolons erkennt, ohne dass ich die Datei neu umformatieren muss? Wenn es sein muss, kann ich auch die Simikolons in andere Zeichen ändern.
Hier ein Beispiel:
Quelltext 1: 2: 3:
| i13;15;25;58;256;128;16;32 l15;564;67;31;46;54; k88;546;54;5 |
Und der Quelltext:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.Open1Click(Sender: TObject); var F: TextFile; S: string; begin begin if OpenDialog1.Execute then begin AssignFile(F, OpenDialog1.FileName); Reset(F); Readln(F, S); Edit1.Text := S; CloseFile(F);
end; end; end; |
Ich danke im voraus!
Moderiert von AXMD: Code- durch Delphi-Tags ersetzt.
|
|
AXMD
      
Beiträge: 4006
Erhaltene Danke: 7
Windows 10 64 bit
C# (Visual Studio 2019 Express)
|
Verfasst: So 20.03.05 18:07
POS und COPY helfen da
AXMD
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: So 20.03.05 18:46
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Function GetWordOfAnsiString(Text : string; WordPos : Word): string; var p : PChar; begin p := PChar(Text); repeat Dec(WordPos); while p^ <> #0 do begin if WordPos = 0 then Result := Result + p^; Inc(p); end; if WordPos = 0 then Exit; Inc(p); until p^ = #0; end; |
hilft da auch ^^
#0 lässt sich durch jedes zeichen ersetzen
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: So 20.03.05 18:53
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: So 20.03.05 18:58
@wulfskin: darauf wollte ich auch hinweisen, nur dass ich den Link noch gesucht hab ^^
damit die Mühe nicht vergebens war hier der Link
www.delphi-forum.de/viewtopic.php?t=13017
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 20.03.05 19:01
Die zwei Funktionen explode und implode müssen einfach mal gepostet werden...
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:
| procedure explode(S: String; C: Char; List: TStrings); Var I, J: Integer; begin List.Clear; if S = '' then exit; J := 1; for I := 1 to length(S) do if S[I] = C then begin List.Add(Copy(S, J, I-J)); J := I+1; end; List.Add(Copy(S, J, I-J)); end;
function implode(List: TStrings; C: Char): String; Var I: Integer; begin if List.Count = 0 then begin Result := ''; exit; end else Result := List.Strings[0]; For I := 1 to List.Count-1 do Result := Result + C + List.Strings[I]; end; |
Anwendung:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Var List : TStringList; S : String; I : Integer; begin S := 'Eintrag1;Eintrag2;Eintrag3';
List := TStringList.Create;
Explode(S,';', List); for I := 0 to List.Count-1 do S := Implode(List, ';'); List.Free; end; |
Oops, da hat einer schon nen Link gepostet. Meine Funktionen also als Alternative 
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: So 20.03.05 19:05
oder meine variante, die ich (pers) einfacher finde 
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 20.03.05 19:08
Naja, die Prozedur ExtractStrings (unit Classes) ist mir erst heute aufgefallen, damit geht's natürlich auch.
@F34r0fTh3D4rk: Deine Prozedur macht irgendwas, auf jeden Fall nicht das gesuchte. Er/Sie will einen String, welches das Zeichen ';' enthält in mehrere Strings unterteilen.
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 20.03.05 22:21
Wo kommen denn die Semikolons überhaupt her ?
_________________ Gruß
Hansa
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 20.03.05 22:28
Dateien im CVS Format sind so. Wenn du z.B. ein Excel Sheet als CVS abspeicherst.
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 20.03.05 22:37
Das halte ich eher für ein Gerücht.  Zumindest im deutschsprachigen Raum verwendet man kein CSV. Wenn das dein CVS überhaupt ist. Auch nicht in Excel. Wozu so was verwenden ?
_________________ Gruß
Hansa
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 20.03.05 22:46
CSV, sorry, Tippfehler. Dass man mit Excel CSV Dateien erstellen kann ist doch kein Gerücht!? CSV ist praktisch und einfach zu implementieren. Oder erstellt deine Delphiapplikation eine xls Datei? Im Übrigen haben nicht alle Excel.
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: So 20.03.05 23:00
Wir reden hoffentlich von "comma separated values". Und die sind Schrott.  Das sollte heutzutage nicht mehr verwendet werden. Egal wie das Trennzeichen sich schimpft. Ich kann doch nicht ein Zeichen als Trennzeichen verwenden, sofern auch nur eine sehr geringe Wahrscheinlichkeit besteht, daß es innerhalb der Daten selbst verwendet wird. 
_________________ Gruß
Hansa
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 20.03.05 23:05
Stimmt schon, aber für Zahlen kann man die schon gebrauchen...
|
|
Lannes
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: So 20.03.05 23:22
|
|
hansa
      
Beiträge: 3079
Erhaltene Danke: 9
|
Verfasst: Mo 21.03.05 02:42
Tja, die Links gucke ich mir erst gar nicht an.  Ich lese da was von Rindvieh-Züchtung. Davon habe ich leider keine Ahnung und überlasse dieses Thema demjenigen, der weiß, wovon er spricht.  Ansonsten empfehle ich eben, feste Feldlängen zu verwenden. Nachzulesen im "Entwickler".
Alternative wäre natürlich auch, eine Textdatei solange umzubauen, bis sie irgendwie paßt.  Ja, dann mal weiter so.
_________________ Gruß
Hansa
|
|
ebs 
      
Beiträge: 213
Suse Linux 9.2, Win 98, Win NT, Win XP, Win for Workgroups, Win XP SP2, Dos 6.1
D3 Prof, D2005 PE, Delphi 2006 Prof.
|
Verfasst: Mo 21.03.05 09:07
Titel: Danke!
Hallo,
ihr habt mir sehr geholfen. Eure Methoden funktionieren genauso, wie ich das haben wollte. Vielen Dank!
|
|
opfer.der.genauigkeit
      
Beiträge: 754
Erhaltene Danke: 1
|
Verfasst: Mo 21.03.05 09:25
Hi ebs,
sicherlich nicht die performanteste aber "faulste" Methode wäre das hier  :
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var List: TStringList; s : string; i : integer; begin List := TStringList.Create;
s := 'test1;test2;test3;test4'; List.Delimiter := ';'; List.CommaText := s;
for i := 0 to ( List.Count - 1 ) do begin end;
List.Free; end; |
_________________ Stellen Sie sich bitte Zirkusmusik vor.
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mo 21.03.05 11:52
@delphiphan: genau dieses "irgendwas", ist das gesuchte !
man kann damit einen string, der durch trennzeichen getrennt ist, in mehere einzelne strings aufteilen, probiers aus !
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: Mo 21.03.05 13:01
Müsstest du aber noch ein Beispiel mitliefern; oder zu mindest sagen, was WordPos ist.
Man will 1 String in mehrere Strings zerteilen. Dabei soll man auch angeben können, welches Zeichen das Trennzeichen ist. Bei deiner Prozedur muss man irgendwie die Wortposition kennen, und man bekommt jeweils nur ein String zurück  Muss man die Prozedur für jeden Eintrag ausführen, und sich jeweils die Position merken? Muss man selbst prüfen, ob man am Ende des Strings ist? Wo geb ich das Trennzeichen an, muss ich da jedes mal den Source an mehreren Stellen ändern gehn? Was ist dann der Vorteil deiner Prozedur gegenüber Pos und Copy? ....
|
|