AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TextFile auslesen mit Funtion

Ein Thema von gene · begonnen am 11. Mär 2008 · letzter Beitrag vom 12. Mär 2008
Antwort Antwort
gene

Registriert seit: 11. Feb 2008
55 Beiträge
 
Delphi 7 Personal
 
#1

TextFile auslesen mit Funtion

  Alt 11. Mär 2008, 04:58
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).
  Mit Zitat antworten Zitat
s-off
(Gast)

n/a Beiträge
 
#2

Re: TextFile auslesen mit Funtion

  Alt 11. Mär 2008, 08:32
Hallo,
Zitat von gene:
Wie man erkennt handelt es sich um eine SQL dump file.
Nö, erkennt man nicht.

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).
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: TextFile auslesen mit Funtion

  Alt 11. Mär 2008, 10:40
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
  Mit Zitat antworten Zitat
gene

Registriert seit: 11. Feb 2008
55 Beiträge
 
Delphi 7 Personal
 
#4

Re: TextFile auslesen mit Funtion

  Alt 11. Mär 2008, 23:08
Hey danke marabu, langsam wirds zur Gewohnheit

Für die Funktion EtractValues muss ich die .sql file in eine Tsringlist laden richtig?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: TextFile auslesen mit Funtion

  Alt 12. Mär 2008, 06:53
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 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