![]() |
TextFile auslesen mit Funtion
Hi, hier mal die Source
Delphi-Quellcode:
Wie man erkennt handelt es sich um eine SQL dump file. Er soll jetzt ab der Zeile wo INSERT INTO steht alles was in () klammern ist, dazwischen ins Memo1 einfügen. Soweit so gut, tut er auch, aber leider nur zwischen den ersten Klammern. Ich schaffe keine Funktion die alle weiteren Klammern auch ausliest =(.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, StrUtils; type TForm1 = class(TForm) Memo1: TMemo; Button1: TButton; Button2: TButton; procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function GetB(const s, s1, s2: String): String; //return a string between two other strings var iPos, iPosLeft, iPosRight: Integer; begin Result := ''; iPos := Pos(s1, s); if iPos > 0 then begin iPosLeft := iPos + Length(s1); iPos := PosEx(s2, s, Succ(iPosLeft)); if iPos > 0 then begin iPosRight := iPos; Result := MidStr(s, iPosLeft, iPosRight - iPosLeft); end; end; end; procedure TForm1.Button2Click(Sender: TObject); var t : TextFile; var s, Info: String; begin AssignFile(t, 'test.sql'); Reset(t); while not EOF(t) do begin ReadLn(t, s); if Pos('INSERT INTO', s) > 0 then begin Info := GetB(s, '(',')'); Memo1.Lines.add(Info); end; end; CloseFile(t); end; end. ps: Ab Insert Into ist alles in einer Zeile (is halt so). |
Re: TextFile auslesen mit Funtion
Hallo,
Zitat:
Zitat:
|
Re: TextFile auslesen mit Funtion
Hallo,
hier ein imperativer Ansatz:
Delphi-Quellcode:
Getippt und nicht ausführlich getestet.
function AnsiExtractStr(var p: PAnsiChar; delimiters: string): string;
var pStart: PChar; begin pStart := p; while (p <> '') and (AnsiPos(p[0], delimiters) = 0) do Inc(p); if p <> '' then begin SetString(Result, pStart, Integer(p) - Integer(pStart)); end else Result := ''; end; procedure ExtractValues(stmt: string; values: TStrings); const S_VALUES = ' VALUES'; var s: string; iVal, iPar: Integer; p: PChar; begin values.Clear; p := PChar(stmt); iVal := Pos(S_VALUES, AnsiUppercase(stmt)); iPar := PosEx('(', stmt, iVal + Length(S_VALUES)); Inc(p, iPar); while Assigned(p) do begin if AnsiStartsStr('''', p) then s := AnsiExtractQuotedStr(p, '''') else s := AnsiExtractStr(p, ',)'); values.Add(s); while Assigned(p) and (p[0] in [' ', ',']) do Inc(p); if AnsiStartsStr(')', p) then Break; end; end; Freundliche Grüße |
Re: TextFile auslesen mit Funtion
Hey danke marabu, langsam wirds zur Gewohnheit :D
Für die Funktion EtractValues muss ich die .sql file in eine Tsringlist laden richtig? |
Re: TextFile auslesen mit Funtion
Moin.
du kannst, aber du musst es nicht. ExtractValues() erwartet das INSERT-Statement im ersten Parameter, also kannst du den Dump auch zeilenweise verarbeiten. So ein SQL-Dump kann schon mal etwas größer werden und vielleicht musst oder willst du mit dem Hauptspeicher knausern.
Delphi-Quellcode:
Freundliche Grüße
procedure SQLDumpToCsv(var dump, csv: TextFile);
var s: TStrings; stmt: string; begin s := TStringList.Create; try while not Eof(dump) do begin Application.ProcessMessages; ReadLn(dump, stmt); ExtractValues(stmt, s); WriteLn(csv, s.CommaText); end; finally s.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 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