![]() |
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:
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.
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; 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. ![]() 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. -.- |
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ß |
AW: ExtractStrings und '
Delphi-Quellcode:
Stringlist.Delimiter:=';';
Stringlist.StrictDelimiter:= true; Stringlist.DelimitedText :='El''Barto;Evergreen Terrece;Springfield;01.04.1982' |
AW: ExtractStrings und '
Zitat:
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. |
AW: ExtractStrings und '
Zitat:
|
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?
|
AW: ExtractStrings und '
Zitat:
Zitat:
Ich hoffe, ich habe dich so richtig verstanden, was du meintest. :) |
AW: ExtractStrings und '
Zitat:
// EDIT: ![]() |
AW: ExtractStrings und '
Zitat:
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. -.- |
AW: ExtractStrings und '
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:27 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