CSV laden

  • Hallo zusammen,
    nach langer Zeit wollte ich mich mal einem neuen Thema zuwenden und verzweifle daran. Ich hoffe Ihr könnt mir helfen.
    Ich möchte eine Datei laden Daten.csv, diese liegt im gleichen Verzeichnis wie dann das Programm.
    Der Aufbau der Daten.csv variiert aber und so habe ich mir eine Lösung einfallen lassen, die ich aber auch nicht umsetzen kann, da fehlt mir doch wohl einiges. Ich habe auch schon auf bestimmten Seiten geschaut aber nichts gefunden was mir hilft.
    Aufbau der Daten.csv
    "Nr";"Name";"Vorname" = anzahl der ersten Spalte Datensätze variert, sowie die Bezeichnungen und es können sogar noch mehr Feldnamen entstehen
    "@1@","Mustermann";"Max" = 2 Spalte und natürlich auch die anderen


    Jetzt hatte ich mir so etwas vorgestellt um flexibel zu bleiben):
    1. Datei öffnen zum lesen
    2. erste Spalte einlesen
    3. Zählen von ";" (in diesem Fall 2, sind aber 3 Datensätze) also +1 dazu
    4. Variabeln festlegen = A1(Zahl von ";") = Nr
    A2 = Name
    A3 = Vorname usw. usw. für später
    5. Listbox mit Ausgabe A1 = Name usw.
    6. Einlesen von Anzahl Datensätze
    @1@ = @ beide wegnehmen, zuordnen Nr1, Name1, Vorname1
    bis Ende z.B. @156@ = Nr156, Name156, Vorname156
    7. Zuordnen der Datensätze
    Nr1 = 1, Name1 = Mustermann, Vorname = Max
    bis Ende 156 = Nr156 = 156, Name156 = Musterfrau, Vorname156 = Elsa
    8. Listbox mit Ausgabe der Datensätze
    9. Datei schließen
    10. entsprechende Ausgaben erstellen


    Wenn das so klappt könnte ich für spätere Änderungen der csv-Datei flexibel bleiben.
    Aber irgendwie finde ich keinen Ansatz um das umzusetzen.


    Habt ihr einen Vorschlag bzw. eine bessere Lösung ?
    Arbeite mit XPROFAN 10.0


    Danke
    PapaToni


    XProfan 10.0

  • Hat denn die csv-Datei eine maximale Anzahl von Feldern
    oder soll das beliebig verändert werden ?
    Datenfelder, die leer sind oder bleiben, werden durch ein
    , oder ; ersetzt.


    Beispiel :
    1,Mustermann,Max, Köln
    2,Mustermann,,Hamburg
    3,Musterfrau,Elsa,


    Beim 2. fehlt hier jetzt der Vorname und beim 3. der Ort.
    Somit hat jede Zeile der .csv 3 Kommas, also 4 Datenfelder, vorausgesetzt
    es gibt ein Maximum von 4 Feldern.



    Die lfd. Nummer in der 1. Spalte bräuchte man eigentlich nicht.
    Wenn man die .csv in die unsichtbare Listboxliste liest, sind die
    Zeilen ja numeriert.


    Sollten die weiteren Datenfelder aber erst bei Programmlauf
    bekannt werden, so würde ich mal die dBase-Funktionen von
    XProfan anschauen. Damit kann man sehr leicht rausfinden,
    welche Felder schon da sind.


    Wenn man nun ein weiteres Datenfeld braucht, könnte man
    die gesamte dBase Datei in eine Listboxliste einlesen, die
    dBase Datei schließen und dann löschen und mit einer erweiterten
    Struktur, die das neue Datenfeld beinhaltet, eine neue Datendatei
    (.dbf) erstellen. Mit einer Schleife fügt man dann den Inhalt des
    neuen Datenfeldes (die Datensätze sind ja die Zeilen der Listboxliste)
    ein und schreibt sie sogleich auch in die neue dBase Datei.

    Einmal editiert, zuletzt von H.Brill ()

  • Hallo,
    das ganze ist nicht so einfach.
    also die Daten stehen z.B. so in der Datei
    "Nr.";"Nachname";"Vorname";"Anrede";"Geschlecht";"Geburtsdatum"
    "@1@";"Mustermann";"Max";"Herr";"männlich";"01.01.1900"


    in der anderen Datei
    "Nr.";"Nachname";"Vorname";"Geburtsdatum";"Geburtsort"
    "@1@";"Mustermann";"Max";"01.01.1900";"Musterstadt"


    in der nächsten z.B.
    "Nr.";"Nachname";"Vorname";"Anrede";"Strasse";"Hausnr."
    "@1@";"Mustermann";"Max";"Herr";"Musterweg";"10"


    Wie man sieht ist die erste Zeile variabel von Datensätzen. Dazu kommt das diese auch noch in Zukunft erweitert wird.
    Das einzige was Bestand hat sind die Namen in den "", Schreibweise.


    Es gibt mehrere Datensätze und für Auswertungen wäre die Daten so schon wichtig.


    Daher sollte der Aufbau des Programms flexibel sein um später wenig daran zu arbeiten.


    Gruß
    Papa Toni

  • Du hast also mehrere Dateien.
    Das könnte man doch auch in einer Datei unterbringen :
    Nr, Nachname, Vorname, Anrede, Geschlecht, Strasse, Hausnr, Geburtsdatum Geburtsort


    Wenn trotzdem mehrere Dateien gewünscht sind, mußt du auch mit einem Index arbeiten,
    damit man die passenden Datensätze auch in den anderen Dateien findet. Hier wäre das
    Feld Nr. interessant. Herr Mustermann bekommt in allen Dateien die gleiche Nr. zugeteilt.


    Nicht sowas @1@ sondern nur 1.


    Deshalb war auch mein Gedanke, mit dem eingebauten dBase zu arbeiten, nicht so
    verkehrt. Da könnte man eine Indexdatei, die auf Nr. zeigt, für alle Tabellen benutzen.

  • Hallo,


    das hatte ich ja schon in meinem ersten Beitrag geschrieben :


    "@1@ = @ beide wegnehmen, zuordnen Nr1, Name1, Vorname1
    bis Ende z.B. @156@ = Nr156, Name156, Vorname156"


    und ja es sind verschiedene Dateien, aber jede soll für sich seperat eingelesen und bearbeitet und ausgegeben werden.


    Zusammenhängend eine datei erstmal nicht, das ist mit dieser Konstellation der Bearbeiter nicht möglich.
    Soll irgendwann später wenn das Hauptprogramm erneuert wird erfolgen, kann aber noch einige Zeit dauern.
    Daher die einzelnen Ausgaben um seine Daten zu befüllen.


    Aber wie gesagt später alles. Jetzt ist es erstmal wichtig ein flexibles Einlesprogramm zu erstellen.


    Gruß
    Papa Toni

  • Die Hochkommas (") in den Dateien würde ich mal als erstes ganz weglassen.
    Das gibt nur Schwierigkeiten beim Einlesen. Ohne diese ist es ja ganz simpel,
    die einzelnen Zeilen, die ja die Datensätze darstellen, in eine Gridbox einzulesen.


    Vorteilhaft erweist es sich, wenn du die Feldnamen in der ersten Zeile der jeweiligen
    Datei mit reinschreibst :


    Nr.,Nachname,Vorname,Geburtsdatum,Geburtsort
    1,Mustermann,Max,01.01.1900,Musterstadt


    Das wäre jetzt eine Datei mit nur einem Datensatz.


    Die Feldnamen in der ersten Zeile kann man zum Aufbau der Gridbox
    (Spaltennamen) sehr gut verwenden. So ein Beispielprogramm kann
    ich dir gerne mal machen.


    Ich nehme mal an, daß dein zukünftiges Programm verschiedene
    Personen bedienen sollen.
    Zur Bearbeitung würde ich dafür verschiedene Dialoge nehmen. Das
    wäre dann einfacher, als in einem Fenster, je nach Datei, die Editierfelder
    und die Gridbox zu ändern. Somit hätte dann jeder Bearbeiter sein eigenes
    Fenster (Dialogbox), in dem er dann arbeitet.


    Welche Profan-Version hast du eigentlich ?
    Es geht mir darum, wie ich es dann umsetzen muß. Bei der Version X3
    oder auch FreeProfan geht ja vieles einfacher (z.B. Move - Funktionen usw.)
    Deshalb frage ich danach.

  • Hallo,


    ich benutze XProfan 10.0


    Wenn Du das mit dem Programm hinbekommst, so das ich für mich daran weiterarbeiten kann, wäre mir schon sehr geholfen.
    Daher sage ich schonmal DANKE.


    Gruß
    Papa toni

  • Da hätte ich diesbezüglich noch eine Frage :
    Wenn Bearbeiter A in seiner Datei was ändert,
    soll die Änderung auch in den beiden anderen
    Dateien automatisch erfolgen ?


    Beispiel :
    Frau Mustermann wird geschieden und nimmt ihren
    Mädchennamen wieder an. Somit müßte in allen 3
    Dateien der Nachname geändert werden.
    Es sei denn, jemand zieht um. Aber da ändert sich ja
    nur etwas in einer einzigen Datei.


    Ansonsten sind ja die anderen Felder unverändert,
    Vorname, Anrede, Geschlecht usw. ändern sich ja nicht.



    Da hat man nun den Nachteil, daß alle 3 Dateien geändert werden müssen.
    Deshalb war mein Vorschlag, alles in einer einzigen Datei zu belassen.
    Man könnte z.B.
    bei Bearbeiter A
    Nr, Nachname, Vorname, Anrede, Geschlecht, Geburtsdatum
    anzeigen lassen
    bei Bearbeiter B
    Nr, Nachname, Vorname, Geburtsdatum, Geburtsort
    anzeigen lassen
    und bei Bearbeiter C
    Nr, Nachname, Vorname, Anrede, Strasse, Hausnr
    anzeigen lassen.


    Dabei ist der Nachteil zu beachten, daß so eine DB nicht
    mehrplatzfähig ist. Soll heißen, es können nicht gleichzeitig
    mehrere Bearbeiter auf die gleiche Datei bzw. den gleichen
    Datensatz bearbeiten. Dann weiß man ja nicht, welche Änderung
    von den 3 Bearbeitern die aktuellste ist.


    Am besten wäre, wenn nur einer an den Datensätzen fummeln
    kann und die anderen bekommen sie nur angezeigt.


    Dazu müßte ich wissen, worauf du mit dem Programm abzielst,
    bzw. welche Anforderungen es haben soll.

  • Hallo,
    die Daten.CSV liegt im gleichen Verzeichnis wie später die Programm exe.
    Es greift nur einer auf die Daten zu.
    Die Daten sollen eingelesen werden und dann sortiert ausgegeben werden.
    Durch den Unterschiedlichen Aufbau der Daten.CSV sollte das einlese Programm flexibel sein.


    Eine Sortierung wäre z.b.
    Musterstadt (Geburtsort)
    Und jetzt werden alle Personen aufgelistet die diesen Geburtsort haben
    Musterort
    Und jetzt die nächsten Personen.


    Solche Ausgaben kann ich selber erstellen.Aber das flexible einlesen happert bei mir.
    Es sollen auch keine Eingaben gemacht werden.


    Ich hoffe das das reicht an Informationen.


    Gruß
    Papa Toni

  • Würde für die Flexibilität sowas reichen ?

    Ist jetzt mal nur fürs Laden mit unterschiedlicher Anzahl von Feldern gedacht.
    In der ersten Zeile MÜSSEN dann die Feldnamen stehen :


    Nr.,Nachname,Vorname,Geburtsdatum,Geburtsort
    1,Mustermann,Max,01.01.1900,Musterstadt

  • Hallo,


    erstmal Danke für den Code.
    Habe ihn getestet und ein bisschen an meine Bedürfnisse angepasst.
    Daher hatte ich mich bisher auch nicht mehr gemeldet.


    Bisher macht das Progie alles so wie ich es will.


    Danke. Für deine Hilfe. :thumbup:


    Versuche jetzt den Rest alleine erstmal (macht ja auch mehr Spass etwas alleine zu erstellen und zu tüfteln).
    Wenn ich irgendwo wieder Probleme habe melde ich mich nochmal.


    Gruß
    Papa Toni

  • Der einzige Wermutstropfen bei obigem Code wären noch
    die Spaltenbreiten. Oben habe ich einfach die Breiten der
    Spaltenüberschriften genommen und pro Zeichen * 12
    genommen.


    Man könnte aber vor dem Laden der Datei die Spaltenbreiten
    manuell setzen mit LVM_SETCOLUMNWIDTH. Dazu könnte man
    die Datei genau so gut in die interne Listboxliste einlesen und
    mit SubStr$() die Spalten untersuchen, was da der längste
    String ist. Das dann natürlich für jede Spalte

    Code
    WhileLoop 0, GetCount(0) - 1
       l[&LOOP] = Len(SubStr$(zeile$, x%, ",")))
    EndWhile




    wobei x% für die Spaltennummer und l[] für ein Array steht.
    Im Array selbst müßte man dann die größte Zahl finden und
    diese zur Breitenangabe nutzen.


    Code
    SendMessage(Gridbox&, ~LVM_SETCOLUMNWIDTH, spalte, breite)


    wobei spalte bei 0 anfängt.
    Anbei mal die Listview.ph, die dann mit $H Listview.ph
    eingebunden wird :


  • Also bei mir sieht die CSV-Datei so aus:
    31 Einträge, darunter auch ein Bild welches in der Eingabemaske gewählt und geändert werden kann.

    Code
    Schmitt|Ursula|02.08.2016||F||||||||||||||||F:\XP_PROFAN_12\INSIDER\INS_IMAGES\marktleiter.jpg|02.08.2016 Test 1|02.08.2016 Test 2||||||||
    Müller|Hugo|02.08.2016||M||||||||||||||||F:\XP_PROFAN_12\INSIDER\INS_IMAGES\angela_raute.jpg|02.08.2016 Hallo 1|02.08.2016 Hallo 2||||||||

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!