Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Txt datei in Paradox einlesen (https://www.delphipraxis.net/5293-txt-datei-paradox-einlesen.html)

MrSpock 2. Jun 2003 08:49

Hallo Bedrock,

ZerlegeZeile war tatsächlich gemeint als eine von dir noch zu schreibende Funktion, die 2 Parameter übernimmt und einen String zurückgibt:

1. Eine Zeichenkette (string)
2. Eine Ziffer i, die angibt, welches Feld du benötigst

Also nehmen wir einmal die Zeile:

T 100 5 110 0 M1 Automatenfall 0 1 0 0 0

Wenn du wie oben beschrieben die Zeilen der Textdatei in die Variable "zeile" einliest, und die Prozedur "ZerlegeZeile geschrieben hast, sollte der Aufruf von ZerlegeZeile(zeile, 1) die Zeichenkette "T" zurückliefern, ZerlegeZeile(zeile, 2) liefert "100" u.s.w.

Zur Frage, wie diese Funktion denn aussehen könnte, gibt es ein Problem, das dadurch entsteht, dass du das Leerzeichen als Trennung zwischen den Feldern benutzt (darauf hat ja auch r_kerber schon hingewiesen). Da du ja auch den SMS Text speicherst, dieser aber auch Leerzeichen enthält, ist eine eindeutige Zerlegung sehr schwierig. Ich habe deshalb ja auch in dem anderen Thread, in dem du die Textdatei erstellt hast ein Code Stück gezeigt, dass jedes Feld mit einem Semikolon abgeschlossen hat. Dann hättest du jetzt einfach die Semikolons zählen können und so das Feld ermitteln.

Wenn es dir aber nur um die Gruppenfelder geht, gibt es hier noch einen Ausweg, der aber nicht die Ideallösung (Verwendung eines sinnvollen Trennungszeichens) darstellt. Da ja die letzten 5 Felder immer nur eine 0 oder eine 1 enthalten können, funktioniert folgendes:

Delphi-Quellcode:
lang := Length(zeile);
grp1 := zeile[lang-8];
grp2 := zeile[lang-6];
grp3 := zeile[lang-4];
grp4 := zeile[lang-2];
grp5 := zeile[lang];
D.h. zeile mit Readln einlesen, Gruppen mit dem obigen Code auswerten.

r_kerber 2. Jun 2003 08:58

das würde aber folgendes bedeuten:

grp1 = 0 1 0 0 0
grp2 = 1 0 0 0
grp3 = 0 0 0
grp4 = 0 0
grp5 = 0

grp1-5 müßten somit IMHO mit String[1] deklariert werden.

Ansosnsten sollte aber auch folgendes funktionieren;

Delphi-Quellcode:
grp1 = Copy (zeile, lang-8, 1);
grp2 = Copy (zeile, lang-6, 1);
grp3 = Copy (zeile, lang-4, 1);
grp4 = Copy (zeile, lang-2, 1);
grp5 = Copy (zeile, lang, 1);

MrSpock 2. Jun 2003 09:02

Hallo r_kerber,

dein Code ist der bessere, weil man immer Copy benutzen sollte. Mein Code funktioniert jedoch auch, weil ich auf die interne Struktur eines "normalen Strings" zugreife. zeile[lang-8] liefert tatsächlich einen einzelnen Char und zwar den neuntletzten :mrgreen: .

r_kerber 2. Jun 2003 09:04

Jetzt wo Du das sagst... :oops:

Bedrock 2. Jun 2003 09:11

:D
Danke schon mal für die Hilfe.

Also die Zeilen der Text datei sind durch Tabulator getrennt und nicht durch Leerezeichen.

Also müsste es doch einen Weg geben um die Zeilen mit dem Tabulator zu trennen. Oder nicht??

MrSpock 2. Jun 2003 09:18

Hallo Bedrock,

ja, in diesem Fall gibt es tatsächlich eine bessere Lösung. Da kommt wieder die Funktion ZerlegeZeile zum Einsatz. Ein Tabulator ist das 9-te ASCII Zeichen als Chr(9). Du kannst also die zeile "scannen" und nach CHR(9) suchen.Das erste Feld startet mit dem Index 1, dass 2-te Feld mit dem auf das erste Chr(9) folgende Zeichen usw.

Bedrock 2. Jun 2003 09:23

Das sind ja schon mal gute Nachrichten.

Aber das mit der Procedur Zeilen zerlegen versteh ich leider immer noch nicht ganz.

Kanst du mir vielleicht mal ein Bsp. posten??

r_kerber 2. Jun 2003 09:36

Das kam gerade in einem anderen Thread. Split-Funktion Sollte auch für Dich geeignet sein.

Bedrock 2. Jun 2003 17:13

:party: :x
kriegs einfach nicht hin. HELP.

Kann ich nicht mit der Batchmove funktion denn Tabulator splitten?
Bekomm immer nur eine Saplte.

MrSpock 2. Jun 2003 21:58

Hallo Bedrock,

hast du es mal mit folgendem Code probiert:

Delphi-Quellcode:
var
  I: Integer;
  Strings: TStringArray;
begin
  { zeile einlesen }
  Strings := Split(zeile, Chr(9));
  if Length(Strings) > 0 then
    for I := Low(Strings) to High(Strings) do
      ShowMessage(Strings[I]);
end;
Mit diesem Code und der Funktion, die dir r_kerber gezeigt hat, solltest du doch die Zeile "Feld für Feld" angezeigt bekommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz