Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TextFile auslesen mit Funtion (https://www.delphipraxis.net/109981-textfile-auslesen-mit-funtion.html)

gene 11. Mär 2008 03:58


TextFile auslesen mit Funtion
 
Hi, hier mal die Source

Delphi-Quellcode:
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.
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 =(.

ps: Ab Insert Into ist alles in einer Zeile (is halt so).

s-off 11. Mär 2008 07:32

Re: TextFile auslesen mit Funtion
 
Hallo,
Zitat:

Zitat von gene
Wie man erkennt handelt es sich um eine SQL dump file.

Nö, erkennt man nicht.

Zitat:

Zitat von gene
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 =(.

Reguläre Ausdrücke (RexEx).

marabu 11. Mär 2008 09:40

Re: TextFile auslesen mit Funtion
 
Hallo,

hier ein imperativer Ansatz:

Delphi-Quellcode:
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;
Getippt und nicht ausführlich getestet.

Freundliche Grüße

gene 11. Mär 2008 22:08

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?

marabu 12. Mär 2008 05:53

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:
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;
Freundliche Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 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