![]() |
Txt datei in Paradox einlesen
Txt datei in Paradox einlesen.
Wie geht das?? :oops: |
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:
Dabei benutzt du eine Prozedur "ZerlegeZeile", die dir aus der übergebenen Zeile den i-ten Feldinhalt liefert.
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; Grundsätzlich ist auch die Komponente BatchMove geeignet, wenn die Struktur der Textdatei eine eindeutige Trennung der Felder erlaubt. |
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. |
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.
|
etwa so??
Delphi-Quellcode:
ZerlegeZeile(zeile, i);??
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; versteh ich leider auch nicht :oops: |
Fast. Für (zeile) solltest Du einen Ausdruck oder eine Prozedur einsetzen, die Dir das i-te Element (Feld) der Textzeile liefert!
|
oh mann ich versteh nur Bahnhof.
Kannst du mir das bite ein wenig genauer beschreiben?? |
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 |
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 |
Zitat:
|
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:
D.h. zeile mit Readln einlesen, Gruppen mit dem obigen Code auswerten.
lang := Length(zeile);
grp1 := zeile[lang-8]; grp2 := zeile[lang-6]; grp3 := zeile[lang-4]; grp4 := zeile[lang-2]; grp5 := zeile[lang]; |
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); |
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: . |
Jetzt wo Du das sagst... :oops:
|
: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?? |
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. |
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?? |
Das kam gerade in einem anderen Thread.
![]() |
:party: :x
kriegs einfach nicht hin. HELP. Kann ich nicht mit der Batchmove funktion denn Tabulator splitten? Bekomm immer nur eine Saplte. |
Hallo Bedrock,
hast du es mal mit folgendem Code probiert:
Delphi-Quellcode:
Mit diesem Code und der Funktion, die dir r_kerber gezeigt hat, solltest du doch die Zeile "Feld für Feld" angezeigt bekommen.
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; |
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?? |
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:
... ist nicht getestet!
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 zeile ein string??
Delphi-Quellcode:
Wenn ja
Readln(ein_datei, zeile);
Fehlermeldung Inkompatible Typen: 'Char' und 'String' :?: |
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. |
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 |
Habs gelöst.
Danke an alle für die Hilfe :firejump: :dancer: :dancer2: :bounce2: :bouncing4: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz