Delphi-PRAXiS

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)

Bedrock 31. Mai 2003 14:48


Txt datei in Paradox einlesen
 
Txt datei in Paradox einlesen.

Wie geht das??
:oops:

MrSpock 1. Jun 2003 09:48

Hallo Bedrock,

dazu liest du die Textdatei mit Readln zeilenweise ein, zerlegst die Zeile in die einzelnen Feldinhalte und weist diese den Tabelle wieder zu, etwa so:

Delphi-Quellcode:
  Readln(d, zeile);
  myTable.Append;
  { angenommen du hast 10 Felder }
  for i := 1 to 10 do
    myTable.Fields[i-1].AsString := ZerlegeZeile(zeile, i);
  myTable.Post;
Dabei benutzt du eine Prozedur "ZerlegeZeile", die dir aus der übergebenen Zeile den i-ten Feldinhalt liefert.

Grundsätzlich ist auch die Komponente BatchMove geeignet, wenn die Struktur der Textdatei eine eindeutige Trennung der Felder erlaubt.

Bedrock 1. Jun 2003 17:07

zeile und Zerlegezeile bring mir eine Fehlermeldung.
Was meinst du damit.

Mein Textfile siegt so aus.
T 100 5 110 2 M1 Synpol Störung 0 0
alles dur Tab getrennt.

r_kerber 1. Jun 2003 17:13

Ich vermute MrSpock meinte, Du sollst eine entsprechende Prozedur schreiben, die genau diese Funktion hat. Und Zeile, denke ich, ist eine String-Variable, in die Du mit ReadLn jeweils eine Zeile Deines Textfiles einliest.

Bedrock 1. Jun 2003 17:33

etwa so??

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var d:textfile;
var i:integer;
var zeile:string;
begin
AssignFile(d, 'c:\sms\sat.txt');
  Readln(d, zeile);
  Table2.Append;
  { angenommen du hast 10 Felder }
  for i := 1 to 10 do
    Table2.Fields[i-1].AsString := (zeile);
  Table2.Post;
end;
ZerlegeZeile(zeile, i);??
versteh ich leider auch nicht :oops:

r_kerber 1. Jun 2003 17:50

Fast. Für (zeile) solltest Du einen Ausdruck oder eine Prozedur einsetzen, die Dir das i-te Element (Feld) der Textzeile liefert!

Bedrock 1. Jun 2003 18:17

oh mann ich versteh nur Bahnhof.

Kannst du mir das bite ein wenig genauer beschreiben??

eddy 1. Jun 2003 20:30

Hallo Bedrock,

eigentlich hat MrSpock Deine Frage beantwortet. Wenn Du damit nichts anfangen kannst - "ich verstehe nur Bahnhof" - dann solltest Du das, was Du eigentlich willst, etwas genauer formulieren, damit man Dir helfen kann.

Dazu mußt Du also mal schildern, was in Deiner Textdatei steht, und welche Informationen daraus Du in welche Felder Deiner Paradox-Datenbank übertragen willst.

Hilfreich wäre Deine Text-Datei oder ein Ausschnitt daraus (z.B. als Download).

mfg
eddy

Bedrock 1. Jun 2003 21:03

OK also dann.

Habe follgende Text Datei mit vollgenden vortlaufenden Zeilen.

T 100 5 110 0 M1 Automatenfall 0 1 0 0 0
T 100 5 110 1 M1 Not Aus 0 1 0 0 0
T 100 5 110 2 M1 Synpol Störung 0 1 0 0 0
T 100 5 110 15 M1 - M3 Brandalarm 0 1 0 0 0
.
.
.

Diese einzelnen Zeilen sollten nun jeweils in 10 Spalten in eine Datenbank geschriben werden.
das heist für die erste Zeile:
Spalte 1: T
Spalte 2: 100
Spalte 3: 5
Spalte 4: 0
Spalte 5: M1 Automatenfall
Spalte 6: 0
Spalte 7: 1
Spalte 8: 0
Spalte 9: 0
Spalte 10: 0

danach neu Datenbankzeile mit der 2. Zeile der Textdatei.

Hoffe es ist nun verständtlich.
Die aufgliderung der Textdatei ist mit einem Tabulator getrennt.
T ->Tab 100 ->Tab 5 ->Tab 110 ->Tab 0 ->Tab M1 Automatenfall-> Tab 0 ->Tab 1 ->Tab 0 ->Tab 0 ->Tab 0

r_kerber 2. Jun 2003 08:08

Zitat:

Zitat von Bedrock
T 100 5 110 0 M1 Automatenfall 0 1 0 0 0
T 100 5 110 1 M1 Not Aus 0 1 0 0 0
T 100 5 110 2 M1 Synpol Störung 0 1 0 0 0
T 100 5 110 15 M1 - M3 Brandalarm 0 1 0 0 0
.
.
.

Sind die einzelnen Spalten durch einen Tabulator getrennt? Falls nicht, dann könnte es ein Problem mit den unterschiedlich langen Texte (M1...) geben.

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.

Bedrock 3. Jun 2003 18:35

ok habe bis jetzt vollgendes

Delphi-Quellcode:
function Split(InStr, SplitAt: String): TStringArray;
var
  I, L: Integer;
begin
  SetLength(Result, 0);
  if InStr = '' then
    Exit;
  I := Pos(SplitAt, InStr);
  L := Length(SplitAt);
  while I > 0 do
  begin
    SetLength(Result, Succ(Length(Result)));
    Result[High(Result)] := Copy(InStr, 1, Pred(I));
    Delete(InStr, 1, Pred(I + L));
    I := Pos(SplitAt, InStr);

  end;

end;


procedure TForm2.Button1Click(Sender: TObject);
var  I: Integer;
  Strings: TStringArray;
    ein_datei:file of char;
begin
assignfile (ein_Datei, 'c:\sms\sat.txt');
reset (ein_datei);
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;

Meine Frage nun

Wo liegen die Zeilen jetzt??
Ich vermute mal im strings:TStringsarray
Wie bekomm ich die Zeilen da wieder raus??
Wie kann ich diesen StringArray auslesen??

MrSpock 3. Jun 2003 19:05

Hallo Bedrock,

es die Zeilen sind leider verschwunden :shock: . Jede Zeile wird der Liste "strings" zugewiesen und hinterher wieder überschrieben. Du musst also das Ergebnis der Zerlegung erst wieder in die Tabelle schreiben:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var  I: Integer;
  Strings: TStringArray;
   ein_datei:file of char;
begin
  assignfile (ein_Datei, 'c:\sms\sat.txt');
  reset (ein_datei);
  while Not EOF(ein_datei) do
  begin
     Readln(ein_datei, zeile);
     Strings := Split(zeile, Chr(9));
     if Length(Strings) > 0 then
     begin
       myTable.Append;
       for I := Low(Strings) to High(Strings) do
         if I < myTable.FieldCount then
           myTable.Fields[I].AsString := Strings[I];
       myTable.Post;
     end
  end;
   CloseFile(ein_datei);
end;
... ist nicht getestet!

Bedrock 3. Jun 2003 19:30

ist zeile ein string??

Delphi-Quellcode:
Readln(ein_datei, zeile);
Wenn ja

Fehlermeldung
Inkompatible Typen: 'Char' und 'String'

:?:

MrSpock 3. Jun 2003 19:44

Hallo Bedrock,

ja, zeile ist ein String. Der Fehler liegt in der Deklaration von ein_datei. Diese muss als TextFile und nicht file of char deklariert werden.

Bedrock 3. Jun 2003 20:25

Ok sieht jetzt schon besser aus.

Noch zwei kleine Probleme.
Im DB Grid werden nur solange Daten eingefügt wie das feld groß ist.
Es wird immer nur eine Spalte geschrieben.
bei mir in diesem fall immer nur T (Siehe Auschnitt Text Datei weiter oben)

Tabelle wird nicht gespeichert??

Aber im großen und ganzen schon nicht schlecht :bounce2:

Mercy

Bedrock 3. Jun 2003 22:26

Habs gelöst.

Danke an alle für die Hilfe

:firejump: :dancer: :dancer2: :bounce2: :bouncing4:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:50 Uhr.

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