Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String partitionell auslesen (https://www.delphipraxis.net/60591-string-partitionell-auslesen.html)

KuraiSama 9. Jan 2006 19:06


String partitionell auslesen
 
hallo
ich habe eine text datei in der mehrere strings stehen, jeder der strings ist wie folgt aufgebaut:

Zitat:

"Item1" "Item2" "Resultitem" amount
wie kann ich die eizelnen teile (item1,item2, resultitem und amount) auslesen? wohlbemerkt das um amount keine " " stehen.

danke schonma

Matze 9. Jan 2006 19:20

Re: String partitionell auslesen
 
Hallo,

schau mal nach Hier im Forum suchenExplode oder mach es manuell per Delphi-Referenz durchsuchenPos, evtl. Delphi-Referenz durchsuchenPosEx (ab Delphi 6 oder 7, weiß nicht) und mit Delphi-Referenz durchsuchenCopy.

ichbins 9. Jan 2006 19:27

Re: String partitionell auslesen
 
du könntest z.B. 'n bisschen nachdenken und ne eigenen func schreiben.
Delphi-Quellcode:
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;
(ungetestet)

Sir Rufo 9. Jan 2006 19:33

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:
[DateiName.txt]
Format=Delimited( )
ColNameHeader=False

Col1=Item1 Text
Col2=Item2 Text
Col3=ResultItem Text
Col4=Amount Integer
Die Doku zum Aufbau der Schema.ini findest Du hier Doku zu Schema.ini
Ja und jetzt kann man hier auf diese Datei zugreifen, wie auf eine Datenbank-Tabelle (sehr nett und spart Programm-Code)

cu

Khabarakh 9. Jan 2006 19:44

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.

KuraiSama 9. Jan 2006 20:08

Re: String partitionell auslesen
 
Zitat:

Zitat von Sir Rufo
Es gibt auch die Möglichkeit, dieses per ADO-Komponenten auszulesen:

Lege eine Schema.ini Datei an mit folgenden Einträgen:
Delphi-Quellcode:
[DateiName.txt]
Format=Delimited( )
ColNameHeader=False

Col1=Item1 Text
Col2=Item2 Text
Col3=ResultItem Text
Col4=Amount Integer
Die Doku zum Aufbau der Schema.ini findest Du hier Doku zu Schema.ini
Ja und jetzt kann man hier auf diese Datei zugreifen, wie auf eine Datenbank-Tabelle (sehr nett und spart Programm-Code)

cu

das scheint mir doch am einfachsten und am schnellsten zu gehen. hab noch nie in delphi mit datenbank-tabellen gearbeitet, wie greife ich dementsprechend auf die datei dann zu?

Sir Rufo 9. Jan 2006 21:44

Re: String partitionell auslesen
 
Nimm dir ADOTable auf das Form und trage bei "ConnectionString" folgendes ein:
Code:
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;
Das ganze ist natürlich ein String und nur der Lesbarkeit halber beim ; getrennt ;-)

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:
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
Das ist eigentlich schon das ganze Geheimnis, ansonsten schaust du mal im Bereich DB vorbei

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