Delphi-PRAXiS
Seite 3 von 7     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi csv Datei Import ClassHelper für TClientDataSet (https://www.delphipraxis.net/164041-csv-datei-import-classhelper-fuer-tclientdataset.html)

nahpets 9. Jun 2017 12:13

AW: csv Datei Import ClassHelper für TClientDataSet
 
Was verwirrt daran?

; trennt die einzelnen Werte.

Die Werte werden mit " eingerahmt.

; sind damit, wenn sie sich im mit " eingerahmten Text befinden, keine Trenner mehr.

Die "verwirrenden" Variante entspricht dem definierten und sowohl erwünschten, wie auch dem erwarteten Verhalten.

Wenn man " in 'ner CSV hat und ; als Trenner, dann sollte man nicht die " aus der CSV entfernen und hoffen, dass im Text keine ; vorkommen. Sollte dem dann doch so sein, kann das nur scheitern.

MaBuSE 9. Jun 2017 12:32

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von H.Bothur (Beitrag 1373986)
Das passiert an der Stelle Fields[j].AsString := slRow[j];

Delphi-Quellcode:
    DisableControls;
    for i := 0 to slFile.Count - 1 do
    begin
      slFile[i] := StringReplace(slFile[i], '"', '''', [rfReplaceAll, rfIgnoreCase]);
      slRow.DelimitedText := slFile[i];
      Append;
      for j := 0 to slRow.Count -1 do
      begin
        Fields[j].AsString := slRow[j];
      end;
      Post;
    end;
    EnableControls;
  finally
    slFile.Free;
    slRow.Free;
  end;
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Mahnung.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x00684abe: read of address 0x00000000' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

slRow[j] hat zu dem Zeitpunkt folgenden Inhalt:

"12345";"1";"Müller-Meyer";"Müller-Meyer-Schulze GmbH";"";"Elbchaussee 1";"D";"22000";"Hamburg";"";"Frau";"Michaela";"Mül ler";"+49 (40) 123456-0";"+49 (40) 123456 111";"m.mueller@mueller-meyer.de";"1";"36";"rechnung@mueller-meyer.de; einkauf@mueller-meyer.de"

Die Fehlermeldung deutet auf einen Zugriff auf ein nicht erzeugtes Objekt.

Könnte es sein, das in der 1. Zeile weniger Felder definiert sind als in dieser Zeile.
Der Helper legt er "nur" die Anzahl der Felder an, die in der 1. Zeile stehen.

Das sollte ja auch nur als Beispiel dienen. ;-)

Welche Wert hat
Delphi-Quellcode:
slRow.Count
bei i=0 ?
Und welchen Wert hat es in der Zeile, die den Fehler wirft?

MaBuSE 9. Jun 2017 12:35

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von nahpets (Beitrag 1373988)
Was verwirrt daran?

Wenn Du den ganzen Beitrag gelesen hättest wüsstest Du was ihn verwirrt. :thumb: :stupid:

nahpets 9. Jun 2017 12:50

AW: csv Datei Import ClassHelper für TClientDataSet
 
Was ihn verwirrt ist doch ganz einfach:

Wenn ich die QuotedChar entferne und dann durch das ; im Text ein Feld mehr bekomme, als in der ersten Zeile, dann muss das krachen.

Wenn ich 'ne CSV mit QuotedChar habe, dann sollte ich das auch entsprechend verwenden.
Ein zusätzliches ; zwischen den QuotedChars führt dann nicht zu 'ner abweichenden Feldzahl in der entsprechenden Zeile und damit auch nicht zu der Exception.

Zitat:

Zitat von MaBuSE
Wenn Du den ganzen Beitrag gelesen hättest wüsstest Du was ihn verwirrt.

Habe den ganzen Beitrag gelesen und deshalb beschrieben, wo die Verwirrung herkommt und dass sie, bei korrekter Verwendung von QuotedChar und Delimiter in CSV-Dateien, nicht aufkommen würde.

Oder anders:

Wenn man aus der CSV die " entfernt, dann führt das ; in diesem Text rechnung@mueller-meyer.de; einkauf@mueller-meyer.de zu der Exception, es ist dann der Trenner, der zuviel ist und den Zugriff auf ein nicht erzeugtes Objekt verursacht.

MaBuSE 9. Jun 2017 12:52

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von nahpets (Beitrag 1373992)
Was ihn verwirrt ist doch ganz einfach:

Wenn ich die QuotedChar entferne und dann durch das ; im Text ein Feld mehr bekomme, als in der ersten Zeile, dann muss das krachen.

Was ihn verwirrt, ist das es kracht, obwohl die QuotedChar richtig gesetzt ist !!!

nahpets 9. Jun 2017 13:01

AW: csv Datei Import ClassHelper für TClientDataSet
 
Wieso,

in Post #20 wird es richtig gemacht und funktioniert.

Und darunter steht, dass es ihn verwirrt.

Wenn ich das richtigt interpretiere, verwirrt ihn nicht die fehlerhafte Variante, sondern die korrekte. ;-)

MaBuSE 9. Jun 2017 13:08

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von nahpets (Beitrag 1373994)
Wieso,
in Post #20 wird es richtig gemacht und funktioniert.
Und darunter steht, dass es ihn verwirrt.
Wenn ich das richtigt interpretiere, verwirrt ihn nicht die fehlerhafte Variante, sondern die korrekte. ;-)

Ich vermute es verwirrt ihn, das der selbe Datensatz im Helper einen Fehler wirft und im Beispiel funktioniert.
Aber es ist völlig egal. Wir können nur vermuten. Er wird es uns schreiben.
Er möchte wahrscheinlich "nur" die Allgemeine Schmutzverletzung weg haben :)

In Post #19 wird es auch richtig gemacht und funktioniert nicht.
Es wird 2 mal richtig gemacht. Einmal geht es und einmal nicht.

himitsu 9. Jun 2017 13:12

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von nahpets (Beitrag 1373988)
Die "verwirrenden" Variante entspricht dem definierten und sowohl erwünschten, wie auch dem erwarteten Verhalten.

Dank dem
Delphi-Quellcode:
StrictDelimiter:=False
(Antwort #20) gibt es noch mehr Verwirrungen, da dort nicht nur der definierte Delimiter als Trennzeichen verwendet wird. :stupid:

H.Bothur 9. Jun 2017 13:30

AW: csv Datei Import ClassHelper für TClientDataSet
 
Hi,

Zitat:

Zitat von MaBuSE (Beitrag 1373990)
Könnte es sein, das in der 1. Zeile weniger Felder definiert sind als in dieser Zeile. Der Helper legt er "nur" die Anzahl der Felder an, die in der 1. Zeile stehen.

Nein - jedenfalls nicht wenn ich die Datei mit Excel öffne - dann passt das.

Zitat:

Zitat von MaBuSE (Beitrag 1373990)
Welche Wert hat
Delphi-Quellcode:
slRow.Count
bei i=0 ?
Und welchen Wert hat es in der Zeile, die den Fehler wirft?

bei Beginn: slRow.Count = 19
bei Fehler: slRow.Count = 20

Also interpretiert Delphi dieset "rechnung@mueller-meyer.de; einkauf@mueller-meyer.de" als zwei Felder OBWOHL diese von Anführungszeichen eingeschlossen sind. Wenn ich die zweite Email-Adresse weiter nach vorne setze ... also so:

"12345";"1";"Müller-Meyer";"Müller-Meyer-Schulze GmbH";"";"Elbchaussee 1";"D";"22000";"Hamburg";"";"Frau";"Michaela";"Mül ler";"+49 (40) 123456-0";"+49 (40) 123456 111";"m.mueller@mueller-meyer.de; einkauf@mueller-meyer.de";"1";"36";"...eller-meyer.de"

dann knallt es genauso - und wieder bei Feld 20 :-) In sofern hattest Du schon recht das Feld Nr. 20 nicht existiert. Aber warum ??

Hans

H.Bothur 9. Jun 2017 13:34

AW: csv Datei Import ClassHelper für TClientDataSet
 
Zitat:

Zitat von himitsu (Beitrag 1374001)
Zitat:

Zitat von nahpets (Beitrag 1373988)
Die "verwirrenden" Variante entspricht dem definierten und sowohl erwünschten, wie auch dem erwarteten Verhalten.

Dank dem
Delphi-Quellcode:
StrictDelimiter:=False
(Antwort #20) gibt es noch mehr Verwirrungen, da dort nicht nur der definierte Delimiter als Trennzeichen verwendet wird. :stupid:

Das ist egal .. sowohl bei
Delphi-Quellcode:
StrictDelimiter:=False
als auch bei ":=True" knallt es :-(

Hans


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 Uhr.
Seite 3 von 7     123 45     Letzte »    

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