String partitionell auslesen
hallo
ich habe eine text datei in der mehrere strings stehen, jeder der strings ist wie folgt aufgebaut: Zitat:
danke schonma |
Re: String partitionell auslesen
|
Re: String partitionell auslesen
du könntest z.B. 'n bisschen nachdenken und ne eigenen func schreiben.
Delphi-Quellcode:
(ungetestet)
procedure getpartstrings(ws:string;results:array of string);
const seperator:char=' '; stringmarker:char='"'; var i:integer; inmarker:boolean; s:string; begin s:=trim(ws); inmarker:=true; setlength(results,1); for i:=1 to length(s) do begin if s[i]=seperator then setlength(results,length(results)+1) else results[length(results)-1]:=results[length(results)-1]+1; if s[i]=stringmarker then inmarker:=not inmarker; end; for i:=0 to length(results)-1 do if (results[i][1]=stringmarker) and (results[i][length(results[i])]=stringmarker) then results[i]:=copy(results[i],2,length(results[i])-2); end; |
Re: String partitionell auslesen
Es gibt auch die Möglichkeit, dieses per ADO-Komponenten auszulesen:
Lege eine Schema.ini Datei an mit folgenden Einträgen:
Delphi-Quellcode:
Die Doku zum Aufbau der Schema.ini findest Du hier Doku zu Schema.ini
[DateiName.txt]
Format=Delimited( ) ColNameHeader=False Col1=Item1 Text Col2=Item2 Text Col3=ResultItem Text Col4=Amount Integer Ja und jetzt kann man hier auf diese Datei zugreifen, wie auf eine Datenbank-Tabelle (sehr nett und spart Programm-Code) cu |
Re: String partitionell auslesen
Bleibt die Anzahl und Reihenfolge der Strings immer gleich?
Zusätzlich zu den schon vorgeschlagenen Methoden kannst du dir noch die Neuerscheinung des Tages anschauen, die Klasse scheint genau das zu machen, was du willst. Wenn du allerdings öfter solche Stringzerlegungen benötigst, würde ich dir zu Regular Expressions raten, es gibt IMHO nichts Komfortableres :wink: .
Code:
sollte zum Beispiel schon reichen, um alle Strings herauszufischen.
([^ "]+)
|
Re: String partitionell auslesen
Zitat:
|
Re: String partitionell auslesen
Nimm dir ADOTable auf das Form und trage bei "ConnectionString" folgendes ein:
Code:
Das ganze ist natürlich ein String und nur der Lesbarkeit halber beim ; getrennt ;-)
DBQ=<Verzeichnis in dem die Datei zu finden ist>;
Driver={Microsoft Text-Treiber (*.txt; *.csv)}; DriverId=27; Extensions=None,asc,csv,tab,txt; FIL=text; MaxBufferSize=2048; MaxScanRows=25; PageTimeout=5; SafeTransactions=0; Threads=3; UID=admin; UserCommitSync=Yes; Bei "TableName" trägst du dann den Dateinamen ein. Die Schema.ini muss jetzt auch in dem gleichen Verzeichnis vorhanden sein. Im Quelltext kannst Du dann wie folgt auf diese Tabelle zugreifen:
Delphi-Quellcode:
Das ist eigentlich schon das ganze Geheimnis, ansonsten schaust du mal im Bereich DB vorbei
ADOTable1.Open // Tabelle öffnen
while not ADOTable1.Eof // bin ich am Ende? do begin ShowMessage( ADOTable1.FieldByName( 'Item1' ).AsString ); // Item1 in MessageBox ausgeben ShowMessage( ADOTable1.FieldByName( 'Amount' ).AsString ); // Amount als String in MessageBox ausgeben ShowMessage( IntToStr( ADOTable1.FieldByName( 'Amount' ).AsInteger ) ); // Amount als Integer in MessageBox ausgeben ADOTable1.Next; // Nächster Datensatz end; ADOTable1.Close; // Tabelle schließen cu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:36 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