DEA Mangel

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

DEA Mangel

Beitrag von vb6oldie » Mo 11. Sep 2017, 08:00

Hallo Leute,
der DEA, wie er im Gambas Buch unter 17.7.7 beschrieben wird, hat einen Mangel:
Wenn es Textfelder und Zahlenfelder gemischt gibt, wobei die Zahlenfelder keine Textbegrenzer besitzen, wird ein Fehler angezeigt.
Leider kann ich die zugrunde liegende CSV-Datei nicht verändern.
Kann man das eventuell einfach beheben, oder muss der DEA vollkommen neu konzipiert werden?
Hat jemand Erfahrung damit und kann mir jemand eine Lösung anbieten?
Leider kann ich fremden Code, der nur mangelhaft dokumentiert wird, wie hier, sehr schwer lesen (begreifen).
Danke im Voraus.
vb6oldie

Honsek
Foriker
Beiträge: 354
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: DEA Mangel

Beitrag von Honsek » Mo 11. Sep 2017, 17:41

Hallo vb6oldie,

die Arbeit mit csv-Dateien hatte ich erst vor einigen Tagen mal wieder aufgenommen im Zusammenhang mit der Erprobung der CSV-Komponente. Erste Ergebnisse gibt es auch schon in Bezug auf das angegebene Kapitel und entsprechende Projekte.
Wenn es Textfelder und Zahlenfelder gemischt gibt, wobei die Zahlenfelder keine Textbegrenzer besitzen, wird ein Fehler angezeigt.
Dazu hätte ich gern mindestens zwei komplette Zeilen aus der verwendeten CSV-Datei, um die Struktur der Felder zu sehen.
Leider kann ich die zugrunde liegende CSV-Datei nicht verändern.
Warum das nicht? Fehlt diese Datei im Projekt?
Kann man das eventuell einfach beheben, oder muss der DEA vollkommen neu konzipiert werden?
So ein DEA wird fast ausschließlich für genau eine Klasse von Aufgaben geschrieben. Was ist mit dem das im Zitat gemeint oder worauf bezieht sich das das? Der DEA war auch nur als Exkurs gedacht. Viel einfacher geht es mit der Split-Methode, wenn man alle erforderlichen Parameter nutzt. Hast Du schon die Komponente unter http://gambaswiki.org/wiki/comp/gb.util/csvfile eingesetzt?
Hat jemand Erfahrung damit und kann mir jemand eine Lösung anbieten?
Wofür genau?
Leider kann ich fremden Code, der nur mangelhaft dokumentiert wird, wie hier, sehr schwer lesen (begreifen).
Ja - das mag stimmen. Dafür gibt es aber die erläuternden Kommentare im Text und die sind reichlich vorhanden. Stimmt nicht ganz, denn zur Syntax und vor Allem zur Grammatik des DEA wurde nichts gesagt. Das wurde stillschweigend vorausgesetzt, denn es hat nichts mit dem Steuerelement GridView zu tun.

Mit freundlichem Gruß

Hans
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: DEA Mangel

Beitrag von vb6oldie » Di 12. Sep 2017, 07:36

Hallo Honsek,
hier mal 2 Dateien:
attach04.csv
(370 Bytes) 47-mal heruntergeladen
adr04.csv
(791 Bytes) 47-mal heruntergeladen
Die Dateien kann ich insofern nicht ändern, weil das Programm zum erstellen nur begrenzte Möglichkeiten bietet:
Die Feldbegrenzer sind: <">,<'>,<`> und die Feldtrenner sind: <,>,<Tab>,<Space>,<:>,<;>,<|>
aber es gibt keine Möglichkeit auch den Zahlen irgendwelche Begrenzer zu spendieren.
Ich denke, die Split() Funktion kann nicht alles abdecken, was ich hier benötige.
Ich weiß nicht wie ich csvfile einsetzen kann, im Wiki ist nur der Name angeführt.
Das Ergebnis soll auch nicht in einem GridView angezeigt werden,
sondern muss weiter bearbeitet werden um schließlich als weitere csv-Datei endlich in eine Datenbank eingelesen zu werden.
Also werde ich mich weiter mit dem DEA abmühen.
Was ich bis jetzt herausgefunden habe ist, ich muss zuallererst die Zahlen von den Texten trennen und jeweils separat verarbeiten.
Liebe Grüße
Franz

Honsek
Foriker
Beiträge: 354
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: DEA Mangel

Beitrag von Honsek » Di 12. Sep 2017, 11:02

Guten Tag Franz,
Die Dateien kann ich insofern nicht ändern, weil das Programm zum erstellen nur begrenzte Möglichkeiten bietet:
Die Feldbegrenzer sind: <">,<'>,<`> und die Feldtrenner sind: <,>,<Tab>,<Space>,<:>,<;>,<|>
aber es gibt keine Möglichkeit auch den Zahlen irgendwelche Begrenzer zu spendieren.
Um welches Programm handelt es sich? Offensichtlich werden alle Feld-Werte in ein Escape-Zeichen 'eingewickelt' - nur bei Zahlen fällt das offensichtlich weg. Wie sähe das bei einem Datum aus?
Ich denke, die Split() Funktion kann nicht alles abdecken, was ich hier benötige.
Doch - das funktioniert prima!
Ich weiß nicht wie ich csvfile einsetzen kann, im Wiki ist nur der Name angeführt.
Die Komponente hat noch einige Fehlstellen. Erst mal Finger weg und eigene Wege gehen.
Das Ergebnis soll auch nicht in einem GridView angezeigt werden, sondern muss weiter bearbeitet werden um schließlich als weitere csv-Datei endlich in eine Datenbank eingelesen zu werden.
Ah - ja; dahin läuft der Hase. Dann sollte die csv-Datei natürlich allen Regeln für eine gut zu verarbeitende csv-Datei genügen:

Hier sind Regeln für die Erzeugung von CSV-Dateien - gefunden auf https://www.thoughtspot.com/blog/6-rule ... -csv-files - von Jon Avrach:

(1)
Trennen Sie Datenfelder mit einem Feld-Trennzeichen (Separator), in der Regel ein Komma. Wenn Sie kein Komma benutzen wollen, sollten Sie zum Beispiel ein Tab-Zeichen oder ein Pipe-Zeichen oder ein Semikolon wählen.

(4)
Geben Sie der Datei in der ersten Zeile einen Header mit einer Liste der Spaltennamen mit. Dies ist zwar optional, wird aber dringend empfohlen, denn es wirkt wie eine Dokumentation des Inhalts der Datei. Man kann aus den Feldnamen den Datentyp der Feld-Werte ableiten.

(5)
Stellen Sie sicher, dass die Header-Liste auf die gleiche Weise wie die weiteren Zeilen mit dem *gleichen* Feld-Trennzeichen und dem *gleichen* Escape-Zeichen - wenn es verwendet wird - formatiert wird.

(2)
Halten Sie jeden Datensatz auf einer separaten Zeile. Jeder Datensatz muss auf seiner eigenen Zeile beginnen, aber ein einziger Datensatz kann mehrere Zeilen überspannen.

(3)
Nach dem letzten Datensatz sollte die letzte Zeile *ohne* ein Zeilenende-Zeichen enden.

(6)
Denken Sie daran, dass das umschließende Escape-Zeichen (typischerweise doppelte Anführungszeichen) verwendet werden *muss*, wenn zum Beispiel das Feld-Trennzeichen in einem Feld vorhanden ist.

Für weitere Details zu diesen Regeln, können Sie sich auf Wikipedia und in den RFC 4180 (CSV-Spezifikation) gut informieren.
Also werde ich mich weiter mit dem DEA abmühen. Was ich bis jetzt herausgefunden habe ist, ich muss zuallererst die Zahlen von den Texten trennen und jeweils separat verarbeiten.
Nein - Finger weg vom DEA. Zu kompliziert in der Diktion. Ich werde mich mal ransetzen und mit meinen Mitteln nach einem guten Ansatz suchen, denn den könnte ich dann ja auch im Buch vorstellen. An so einen Einsatzfall hatte ich noch nicht gedacht - macht aber Sinn, weil er in der Praxis vorkommen kann.

Achtung: Da die Daten der csv-Datei in eine DB eingelesen werden, ist es interessant vorher zu wissen, wie das DBMS mit Null-Werten umgeht (--> http://www.peterkropff.de/site/mysql/null.htm). Soll für einen Nullwert NULL stehen oder ""?

Mit flotten Grüßen

Honsek
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: DEA Mangel

Beitrag von vb6oldie » Mi 13. Sep 2017, 06:43

Hallo Honsek,
das Programm ist ein MDBFile Viewer, beim ersten anklicken einer MDB-Datenbank erstellt.
Die Zeilen sind mit einem Hex "0A" abgeschlossen und haben das übliche Dateiende-Zeichen (10) - Hex/Dez?
Die Feldbegrenzer sind ein Hex "22" also ein <">/doppeltes Hochkomma.
Die Regeln zum erstellen einer csv-Datei habe ich intus (glaube ich).
Zu Regel 1: Zur Sicherheit werde ich ein Semikolon (falls es doch irgendwo Dezimalzahlen mit einem Komma als Dezimaltrennzeichen geben sollte) als Trenner einsetzen und doppelte Hochkommas als Feldbegrenzer.
Zu 4: Die Datei wird nur von mir verarbeitet/eingelesen und ich weiß, welche Feldinhalte es gibt, daher benötige ich keinen Header.
Zu deinem letzten Absatz: Es werden sowohl <" "> bzw <' '> als auch <NULL> erkannt und haben verschiedene Bedeutungen, wie in http://www.peterkropff.de/site/mysql/null.htm so schön dargestellt wurde.
Ein Datum wurde als Integer gespeichert z.B: yyyymmdd ich weiß daher nicht wie der MDF-FileViewer ein richtiges Datum darstellen würde.
Ich werde mich jedoch weiterhin mit dem DEA beschäftigen, schön langsam begreife ich den Aufbau.
Ich musste erst eine Möglichkeit finden den Aufbau so darzustellen, dass ich den Überblick gewinne.
Wenn du aber eine andere Möglichkeit findest das Problem zu lösen, werde ich mir das ansehen.
Liebe Grüße
Franz

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: DEA Mangel

Beitrag von vb6oldie » Mi 13. Sep 2017, 07:23

Hallo Honsek,
ein Nachtrag:
ich habe soeben in der CSV-Datei folgenden String entdeckt: ,"genossenschaft \"Salzburg\"", erzeugt vom MDB-Viewer.
Im Stringteil <\"> wurde der Backslash eingefügt.
Der original String lautete: genossenschaft "Salzburg"
Das kann ich mit dem DEA nicht bewältigen, da ja nur ein Zeichen nach dem anderen bearbeitet wird.
Ich warte daher auf deine Bemühungen für eine geeignete Lösung.
Liebe Grüße
Franz

Honsek
Foriker
Beiträge: 354
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: DEA Mangel

Beitrag von Honsek » Mi 13. Sep 2017, 08:13

Guten Tag Franz,
,"genossenschaft \"Salzburg\"",
Der Backslash muss sein, damit die so maskierten "-Zeichen nicht als Feldtrenner fehl-interpretiert werden.
Der MDB Viewer (Plus?) gehört offensichtlich zu Windows?

Noch einmal meine Fragen:
  • Wie sollen Null-Werte in der CSV-Datei dargestellt werden?
  • In welche DB-Tabelle (Tabellen-Typ) unter welchem DBMS sollen die CSV-Dateien zukünftig eingelesen werden? Das interessiert, weil ja Linux und Windows unterschiedliche Zeilenende-Zeichen verwenden. Außerdem ist die zu Grunde liegende Codierung der Zeichen (UTF-8?) interessant.
Da es offensichtlich eine spezielle Lösung sein muss, habe ich mein Test-Programm so codiert, dass Änderungen möglich sind. Da die CSV-Datei ohne Header-Zeile auskommt, kannst Du zum Beispiel die Klase CsvFile NICHT einsetzen, denn die (erste) Zeile mit den Feldnamen ist verbindlich.

Mit freundlichem Gruß

Honsek
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: DEA Mangel

Beitrag von vb6oldie » Mi 13. Sep 2017, 09:20

Hallo Konsek,
den MDB-Viewer habe ich unter Ubuntu bezogen, als ich die MDB-Datei erstmals anklickte.
Die MDB-Datenbank war/ist eine Windows-Datei, ich habe aber kein Windows mehr, sondern nur mehr die Datenbank-Datei, so dass ich keine Query mehr machen kann.
Die zukünftige CSV-Datei soll mit PhpMyAdmin in eine MySQL-Datenbank eingelesen werden (InnoDB-Engine).
Daher ist zu unterscheiden, ob NULL (Unbekannter Wert) oder ' ' (leerer String) oder 0 (als Wert 0 in numerischen Werten) vorzugeben ist.
Hier die möglichen Einstellungen beim Importieren:
Bildschirmfoto vom 2017-09-13 10-16-07.png
Bildschirmfoto vom 2017-09-13 10-16-07.png (16.38 KiB) 1920 mal betrachtet
Wenn es sein muss, kann ich auch den Header ausgeben lassen.
Bildschirmfoto vom 2017-09-13 10-10-25.png
Bildschirmfoto vom 2017-09-13 10-10-25.png (24.41 KiB) 1920 mal betrachtet
das ist das Programm MDB-Viewer.

Liebe Grüße
Franz

Honsek
Foriker
Beiträge: 354
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: DEA Mangel

Beitrag von Honsek » Mi 13. Sep 2017, 09:59

Hallo Franz,

ich habe - neben meinen Arbeiten zur Komponente XML - schnell das Programm zum Konvertieren von CSV -> CSV fertiggestellt. Es liegt im Anhang. Deine CSV-Dateien werden nach den schon genannten Regeln bearbeitet und als CSV-Datei mit gleichem Namen + _c.csv abgespeichert.

Mit freundlichem Gruß

Hans
csv_import_export-1.0.11.tar.gz
Konvertierungsprojekt
(18.04 KiB) 45-mal heruntergeladen
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: DEA Mangel

Beitrag von vb6oldie » Mi 13. Sep 2017, 13:36

Hallo Konsek,
wie viele Zeilen kann das Programm bewältigen? 70 000?
Mit wenig Zeilen geht's, auch bearbeiten einzelner Felder geht.
Aber die 70 000 Zeilen verträgt es nicht! Auch das original Programm verträgt es nicht!
Liebe Grüße
Franz

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: DEA Mangel

Beitrag von vb6oldie » Do 14. Sep 2017, 06:19

Hallo Konsek,
danke für deine Bemühungen, ich habe eine andere Möglichkeit gefunden, mein Problem zu lösen:
Ich erstelle eine neue Datenbank mit einer entsprechenden Tabelle, lese die csv-Datei ein und bearbeite die Daten mit SQL-Befehlen.
Wenn ich damit fertig bin kann ich die Daten direkt in meine alte/original/ursprüngliche Datenbank überspielen.

Liebe Grüße
Franz

Honsek
Foriker
Beiträge: 354
Registriert: Do 4. Okt 2007, 17:01
Kontaktdaten:

Re: DEA Mangel

Beitrag von Honsek » Do 14. Sep 2017, 08:41

Hallo Franz,

kaum macht man es richtig - schon geht es. Aber nicht Alles was geht ist auch richtig ... .

Mit flottem Gruß

Honsek
---> Wenn Du eine gute Antwort erwartest, musst Du sehr gut fragen!

vb6oldie
Foriker
Beiträge: 129
Registriert: Mo 17. Apr 2017, 12:51
Kontaktdaten:

Re: DEA Mangel

Beitrag von vb6oldie » Do 14. Sep 2017, 12:08

Hallo Honsek,
da glaubt man es geht endlich, aber dann schlägt Murphy zu.

Liebe Grüße
Franz

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste