Autor Beitrag
ebs
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
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.
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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          { Dialog zum Dateiöffnen anzeigen }
  begin
    AssignFile(F, OpenDialog1.FileName);   { Datei ausgewählt }
    Reset(F);
    Readln(F, S);                          { Erste Zeile der Datei lesen }
    Edit1.Text := S;                       { String in ein TEdit schreiben }
    CloseFile(F);

end;
end;
end;

Ich danke im voraus!

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: So 20.03.05 18:07 
:welcome:

Suche in: Delphi-Forum, Delphi-Library POS und Suche in: Delphi-Forum, Delphi-Library COPY helfen da ;)

AXMD
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 20.03.05 18:46 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: So 20.03.05 18:53 

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 20.03.05 19:01 
Die zwei Funktionen explode und implode müssen einfach mal gepostet werden...
ausblenden 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:
ausblenden 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); // String->List
 for I := 0 to List.Count-1 do
  // in List.Strings[I] sind die Einträge

 S := Implode(List, ';'); // List->String
 List.Free;
end;

Oops, da hat einer schon nen Link gepostet. Meine Funktionen also als Alternative :)
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: So 20.03.05 19:05 
oder meine variante, die ich (pers) einfacher finde :roll:
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 20.03.05 22:21 
Wo kommen denn die Semikolons überhaupt her ?

_________________
Gruß
Hansa
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 20.03.05 22:28 
Dateien im CVS Format sind so. Wenn du z.B. ein Excel Sheet als CVS abspeicherst.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 20.03.05 22:37 
Das halte ich eher für ein Gerücht. 8) 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: So 20.03.05 23:00 
Wir reden hoffentlich von "comma separated values". Und die sind Schrott. :mrgreen: 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. :shock:

_________________
Gruß
Hansa
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 20.03.05 23:05 
Stimmt schon, aber für Zahlen kann man die schon gebrauchen...
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: So 20.03.05 23:22 
Hallo,
user profile iconhansa hat folgendes geschrieben:
Das halte ich eher für ein Gerücht. 8) Zumindest im deutschsprachigen Raum verwendet man kein CSV. Wenn das dein CVS überhaupt ist. Auch nicht in Excel. Wozu so was verwenden ?

Zitat
Ab 26. September 1999 sind alle Rinder in Deutschland gemäß
§ 24f der Viehverkehrsverordnung zu erfassen.
:arrow: Hi-Tier Bundesweite Tierdatenbank
:arrow: Import Exceltabellen in die Wikipedia
:arrow: Arcor-Abrechnungen mit Webbill

user profile iconhansa hat folgendes geschrieben:
Wir reden hoffentlich von "comma separated values". Und die sind Schrott. :mrgreen: 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. :shock:

Doch:
ausblenden Quelltext
1:
1;"Text mit "" im Text";"oder mit ; im Feld";123					

das dann aufgeteilt(mit einem guten Programm :? ):
ausblenden Quelltext
1:
2:
3:
4:
1
Text mit " im Text
oder mit ; im Feld
123


MfG Lannes
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mo 21.03.05 02:42 
Tja, die Links gucke ich mir erst gar nicht an. :lol: Ich lese da was von Rindvieh-Züchtung. Davon habe ich leider keine Ahnung und überlasse dieses Thema demjenigen, der weiß, wovon er spricht. 8) 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. :P Ja, dann mal weiter so.

_________________
Gruß
Hansa
ebs Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
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.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mo 21.03.05 09:25 
Hi ebs,

sicherlich nicht die performanteste aber "faulste" Methode wäre das hier :lol: :

ausblenden 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
    // was auch immer
  end;

  List.Free;
end;

_________________
Stellen Sie sich bitte Zirkusmusik vor.
F34r0fTh3D4rk
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 5284
Erhaltene Danke: 27

Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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? ....