Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   ExtractStrings und ' (https://www.delphipraxis.net/169091-extractstrings-und.html)

Maya 28. Jun 2012 06:25

Delphi-Version: 2010

ExtractStrings und '
 
Hallo ihr Lieben,

mein Abschlussprojekt steht soweit und nun wollte ich mit den Echtdaten alles testen. Es geht ja darum, dass ich CSV-Dateien einlesen soll und die Daten auf eine Datenbank spielen, soweit die Kurzfassung. Was dazwischen noch so passiert, ist erst einmal unwichtig.

Jedenfalls: erste Datei klappte wunderbar, zweite Datei - Fehlermeldung.
Nach stundenlangen suchen bin ich darauf gestoßen, dass scheinbar das ExtractStrings nicht damit klar kommt, wenn diese Dinger hier ' in den Datensätzen sind. Hier mal der Code.

Delphi-Quellcode:
procedure TDateiEinlesen_Frame.ReadFile;
var i: Integer;
    aBuffer: String;
begin
  Datenliste:=TStringList.Create;
  Datenliste.LoadFromFile(Dateiname);

   for i := 0 to Datenliste.Count - 1 do
      begin
        aBuffer:=Datenliste.Strings[i];
        aBuffer:= ';' + aBuffer + ';';
        aBuffer:= StringReplace(aBuffer, '"', '', [rfReplaceAll]); // Das ganze Ersetzen ist notwendig,
        aBuffer:= StringReplace(aBuffer, ';;', ';NULL;', [rfReplaceAll]); //da wir von externen Stellen
        aBuffer:= StringReplace(aBuffer, ';;', ';NULL;', [rfReplaceAll]);//die Daten bekommen.
        Datenliste.Strings[i]:=aBuffer;
      end;

  INIinitialisieren;
end;

procedure TDateiEinlesen_Frame.CreateSpalten(aZeile: Integer);
var Daten: PWideChar;
begin
  Spaltenliste:=TStringList.Create;

  Daten:=PWideChar(Datenliste.Strings[aZeile]);

  ExtractStrings([';'],[' '],Daten,Spaltenliste);
end;
Ich lade erst von der Datei jede Zeile ein und lese dann die Zeilen einzeln aus, welche ich gerade benötige. Danach erstelle die Spalten.
Wenn aber nun ein Name vorhanden ist á la "El'Barto", habe ich dann in einen String alles mit drin, was nach den Namen kommt, also so in etwa "El'Barto;Evergreen Terrece;Springfield;01.04.1982".

Wenn ich nun die Spalten abfrage, um das INSERT zu basteln, knallt's regelmäßig, weil ich über das Listenmaximum gehe, ist ja klar. ;)

Beim googeln bin ich schon darauf gestoßen, dass jmd. anderes schon das Problem hatte, aber leider gab's da keinen Lösungsvorschlag, den ich als sinnvoll erachtete. http://www.tek-tips.com/viewthread.cfm?qid=1116998

Nun brauch ich euch schlaue Leute. :cheer:

Edit: Gerade hier d'rauf gestoßen:
Separators are ignored when inside a quoted string until the final end quote.
Jetzt weiß ich, WARUM das passiert, aber noch nicht, wie ich das umgehen kann. -.-

angos 28. Jun 2012 06:41

AW: ExtractStrings und '
 
Hi,

ich habe mir für einen solchen Zweck mal eine eigene Prozedur geschrieben. Vielleicht hilft dir die weiter:
Delphi-Quellcode:
procedure DelimitedStringToStringList(s, sDelim: string; var SL: TStringList);
var
  i, ilen: Integer;
  sStr: string;
begin
  SL.Clear;

  sStr := '';
  ilen := Length(sDelim);
  i := 1;
  while (i <= Length(s)) do
  begin
    if (Copy(s, i, ilen) <> sDelim) then
    begin
      sStr := sStr + s[i];
      Inc(i);
    end
    else
    begin
      SL.Add(sStr);
      sStr := '';
      Inc(i, ilen);
    end;
  end;
  if sStr <> '' then
    SL.Add(sStr);
end;

Gruß

Bummi 28. Jun 2012 06:50

AW: ExtractStrings und '
 
Delphi-Quellcode:
  Stringlist.Delimiter:=';';
  Stringlist.StrictDelimiter:= true;
  Stringlist.DelimitedText :='El''Barto;Evergreen Terrece;Springfield;01.04.1982'

Maya 28. Jun 2012 07:01

AW: ExtractStrings und '
 
Zitat:

Zitat von Bummi (Beitrag 1172766)
Delphi-Quellcode:
  Stringlist.Delimiter:=';';
  Stringlist.StrictDelimiter:= true;
  Stringlist.DelimitedText :='El''Barto;Evergreen Terrece;Springfield;01.04.1982'

Danke dir! Auf die Funktion wäre ich nie gekommen!
Jetzt muss ich nur noch 'ne Lösung dafür finden, dass das einzelne Anführungszeichen bei "El'Barto" auch einzeln bleibt für den SQL-Quelltext.

jaenicke 28. Jun 2012 07:48

AW: ExtractStrings und '
 
Zitat:

Zitat von Maya (Beitrag 1172767)
Jetzt muss ich nur noch 'ne Lösung dafür finden, dass das einzelne Anführungszeichen bei "El'Barto" auch einzeln bleibt für den SQL-Quelltext.

Wie meinst du das? Eigentlich sollte das bei DelimitedText nicht verändert werden.

Furtbichler 28. Jun 2012 07:56

AW: ExtractStrings und '
 
CSV-Dateien kann man fast immer mit einem Bulk Insert in die Zieldatenbank pusten. Das geht verdammt schnell. Wo soll's denn hingehen, also welches RDMBS ist das Ziel?

Maya 28. Jun 2012 08:41

AW: ExtractStrings und '
 
Zitat:

Zitat von jaenicke (Beitrag 1172768)
Zitat:

Zitat von Maya (Beitrag 1172767)
Jetzt muss ich nur noch 'ne Lösung dafür finden, dass das einzelne Anführungszeichen bei "El'Barto" auch einzeln bleibt für den SQL-Quelltext.

Wie meinst du das? Eigentlich sollte das bei DelimitedText nicht verändert werden.

Die DB meckert beim INSERT, dass das ' als schließendes Anführungszeichen angesehen wird und deswegen für den Reste in falscher Syntax entsteht. Aber ich hab schon 'n Tipp vom Kollegen bekommen, was ich mal ausprobieren soll.

Zitat:

Zitat von Furtbichler (Beitrag 1172769)
CSV-Dateien kann man fast immer mit einem Bulk Insert in die Zieldatenbank pusten. Das geht verdammt schnell. Wo soll's denn hingehen, also welches RDMBS ist das Ziel?

Das die CSV einfach auf die DB gepackt werden sollen, geht nicht so einfach, da wir ja von verschiedenen Stellen die bekommen und die immer anders aufgebaut sind und die Spalten anders heißen, durcheinander sind usw. ... Hab auch eben mitbekommen, dass bei einer Datei falsche Angaben in einer Spalte sind. Muss mir da jetzt auch noch was einfallen lassen. -.-
Ich hoffe, ich habe dich so richtig verstanden, was du meintest. :)

jaenicke 28. Jun 2012 08:51

AW: ExtractStrings und '
 
Zitat:

Zitat von Maya (Beitrag 1172775)
Die DB meckert beim INSERT, dass das ' als schließendes Anführungszeichen angesehen wird und deswegen für den Reste in falscher Syntax entsteht.

Ich würde dir raten Parameter zu benutzen. Dann wird das intern automatisch escaped. ;-)

// EDIT:
http://docwiki.embarcadero.com/Libra...ms.ParamByName

Maya 28. Jun 2012 08:53

AW: ExtractStrings und '
 
Zitat:

Zitat von jaenicke (Beitrag 1172779)
Zitat:

Zitat von Maya (Beitrag 1172775)
Die DB meckert beim INSERT, dass das ' als schließendes Anführungszeichen angesehen wird und deswegen für den Reste in falscher Syntax entsteht.

Ich würde dir raten Parameter zu benutzen. Dann wird das intern automatisch escaped. ;-)

Einmal bekam ich den Tipp oder das, was ich jetzt nutze sind doppelte Anführungszeichen, also ". Die nehme ich einfach als Begrenzung für Char-Werte oder so in dem Befehl. Dann ignoriert er die einfachen.
EDIT: Keine Sorgen, hab schon oft mit Parametern gearbeitet, gerade wenn es etwas dynamischer sein soll. :)

So, das Problem gelöst, fehlen noch drei weitere. ;)
Ich hasse die Phase der Tests auf Herz und Nieren. -.-

Bummi 28. Jun 2012 08:55

AW: ExtractStrings und '
 
Zitat:

Ich hasse die Phase der Tests auf Herz und Nieren
:wink: , ist die spannendste ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:49 Uhr.
Seite 1 von 2  1 2      

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