Seite 1 von 2

Arbeiten mit einer .CSV Datei

Verfasst: 14.05.2015 23:33
von HHYayo
Schönen guten "Abend".

Ich habe vor etlichen Zeiten schon einmal mit Purebasic gearbeitet. Da dies jedoch nur oberflächlich war und ich dementsprechend eingerostet bin und eigentlich so gut wie keinen Bezug mehr dazu habe, poste ich meine Frage unter Anfänger.

Ich habe eine .CSV Datei mit einer Tabelle drin, bestehend aus 14 Spalten und aufgerundet gut 8000 Einträgen. Die Spalten tragen die Namen: Hersteller, Serie, Ausführung, Modelljahr, Art, Leistung, Getriebe, Hersteller Baureihe, Stgnr.Her, Stgnr.stg, Softwarestand, Lese-Hardware und Info.

Ein Eintrag ist wie folgt augebaut:
Alfa;159;1750 TBi;2011;Turbo-Benzin;200.0PS / 147.1KW;6;Bosch;MED17.3.1;51901122;0261S07354;515934;;CMD Tricore Boottool
Nun ist mein Ziel, alle Einträge bzw. die komplette Liste in meinem Programm zu inplementieren. Demnach also den String aufteilen, in dem ; als Trennzeichen gesehen wird und die "Einträge" einzelnt unter der jeweiligen richtigen Kategorie unterteilt werden. Eigentlich so wie die Datei in Excell als Tabelle angezeigt wird. Nur ich möchte damit arbeiten. Mein zweites Ziel ist nun in meinem Programm einen bestimmten Eintrag über mehrere Angaben zu suchen. Es gibt z.B viele Einträge mit dem selben Motor, möchte aber nur den Motor haben mit den Baujahr 2008 / 140 PS / Audi / A4, sprich die Suche nur auf die Einträge beschrenken, die genau zu meinem Eingaben passen.

Vielleicht über irgendwelche Libs für Purebasic realisierbar ? Oder denke ich dabei zu komplex ?

Mit freundlichen Grüßen

Re: Arbeiten mit einer .CSV Datei

Verfasst: 14.05.2015 23:57
von ts-soft
Du solltest die CSV Datei zum Beispiel in eine LinkList einladen, diese Überträgst Du auf ein ListIconGadget. Dies ist zwar
doppelt gemoppelt, aber hat den Vorteil, das Du die LinkList oder eine temporäre Kopie, für Deine Zwecke sortieren kannst.
Das erleichtert dann die Suche.

Erst eine Structure erstellen, mit den einzelnen Feldern der Tabelle, davon eine structurierte LinkList erstellen.

Das wäre erstmal der Ansatz dafür.

Gruß
Thomas

Re: Arbeiten mit einer .CSV Datei

Verfasst: 15.05.2015 04:48
von HHYayo
Danke, ich lese nun über ReadFile die Daten aus und lasse sie über AddGadgetItem in das ListIcon einfügen. (Ich war mir sicher es gab eine "Tabellenähnliche Funktion" in Purebasic, ich kam nur nicht auf das ListIcon) Zu dem sind die Einträge auch direkt über den ListIcon editierbar. Gespeichert kann nun auch werden. Allerdings komme ich mit der Suchfunktion nicht weiter.

Letztendlich soll es so laufen das wenn der gewünschte Eintrag mit den Angaben der Suche übereinstimmt zu diesen springt und dieser Eintrag markiert wird, so als ob man Ihn angeklickt hätte.

Ich war am überlegen ob das nicht mit FindString realisierbar wäre. Sprich theoretisch mit der Anzahl an FindStrings arbeiten und das ListIcon Gadget oder File direkt durchsuchen zu lassen. Denke mal das ich denn mit If und And arbeiten müsste, aber irgendwie kommt mir die Lösung unpraktisch vor.

Re: Arbeiten mit einer .CSV Datei

Verfasst: 15.05.2015 09:05
von Bisonte
Bei 8000 oder mehr Einträgen, stellt sich die Frage, ob man das ganze nicht in eine SQLite Datenbank importiert.
Die Suchfunktionen sind hierbei schneller und komfortabler. Falls die Datei noch als .CSV gebraucht wird, halt mit einer Export Funktion.

Edit : Anbei, deine Aufstellung besteht nur aus 13 Feldern, Daten sind aber 14 vorhanden. Irgendwas fehlt da ;)

Re: Arbeiten mit einer .CSV Datei

Verfasst: 15.05.2015 12:51
von HHYayo
Also die Datenbank bleibt bei 8000 Einträgen, da wird nicht stetig was Neues zukommen. Das passt schom so von der Geschwindigkeit her. Das sind auch 14 Einträge, teilweise ist nur nichts in einer Spalte eingetragen. Nehme mal an das du die doppelten Semikolon übersehen hast :) Aber danke für den Hinweis!

Bei der Suche bin ich leider noch nicht weiter gekommen.

Re: Arbeiten mit einer .CSV Datei

Verfasst: 15.05.2015 13:10
von ts-soft
Wenn es nur Windows sein soll, dann könntest Du dies versuchen:
http://www.purebasic.fr/german/viewtopi ... 98#p319898

Suchen mit vorsortierten Einträgen: LinkList, Map
oder Datenbank, z.B. SQLite

Hier solltest Du Dich erstmal entscheiden, weil das kann Dir kaum einer abnehmen, hat alles seine Vor- und Nachteile.
Als Einsteiger wäre die reine Windows-Version von Thorsten1867, oberster Link wahrscheinlich die beste Wahl.

Je nach Entscheidung, dann weiter Fragen, auch zum Einlesen usw. aber erstmal Belesen. Lesen gibt keine Muckies aber
macht Stark :mrgreen:

Gruß
Thomas

Re: Arbeiten mit einer .CSV Datei

Verfasst: 15.05.2015 13:51
von HHYayo
Die Liste ist bereits sortiert und sollte auch so bleiben wie sie jetzt gehalten ist, da diese auch schon so länger genutzt wird :allright: Ich brauche definitiv nur die Windows Version, demnach habe ich mir schoneinmal die Version von Thorsten angeschaut. Allerdings sehe ich so nur die Sortierfunktionen raus, oder übersehe ich etwas ? Meine Entscheidung fällt auf die simpelste, auch wenn vielleicht die Suche paar Sekunden länger dauert oder sonst was. Das Programm geht ja nicht kommerziell auf den Markt oder sonst was sondern wird lediglich für ein Kleinunternehmen das ich mit manage verwendet um die Arbeit etwas zu erleichtern.

Ich stehe so ein bisschen auf dem Schlauch, habe im englischen Forum etwas gefunden (http://www.purebasic.fr/english/viewtop ... con+search) wie über ein WindowCallback das ListIcon zu einem Text springt der eingegeben wird. Allerdings ist das ja nur eine Vorgabe, es können ja aber bis zu 14 sein.

Es soll ja nur zum Eintrag springen und den Eintrag markieren nachdem gesucht wird :mrgreen:

Re: Arbeiten mit einer .CSV Datei

Verfasst: 15.05.2015 14:20
von ts-soft
HHYayo hat geschrieben:Es soll ja nur zum Eintrag springen und den Eintrag markieren nachdem gesucht wird :mrgreen:
Das vorsortieren ist ja auch nur im Speicher angedacht, so das z.B. alle Einträge mit Kriterium 1 hintereinander stehen usw.,
das macht das ganze schneller.

Thorsten sein Modul sortiert nur nach 3 Krititerien, das müßtest Du erweitern oder ab dann suchen. Aber wenn Du das Modul nimmst, dann das ganze Modul und nicht nur Teile darauf, weil die wirst Du wahrscheinlich nicht zum laufen bekommen :mrgreen:

Aber das einfachste wird sein, das ganze ListIcon zu durchsuchen, Spalte für Spalte. Das setzt aber voraus, das es nur einen Treffer im Ergebnis sein kann.

Gruß
Thomas

Re: Arbeiten mit einer .CSV Datei

Verfasst: 15.05.2015 14:49
von HHYayo
Doppelte identische Einträge gibt es nicht. Es kann zum Beispiel sein das es einen Eintag für einen VW gibt, die spätestens ab Softwarestand oder Steuergerät Nummer abweichen. Wenn er bis dahin springt reicht das ja. Ich habe mir bereits diese beiden Prozeduren eingebaut:

Code: Alles auswählen

Procedure WinCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
      *pnmh.NMHDR = lParam
      Select *pnmh\code
        Case #LVN_ODCACHEHINT, #LVN_ODSTATECHANGED
          result = 0
        Case #LVN_GETDISPINFO
          *pnmlvdi.NMLVDISPINFO = lParam
          If *pnmlvdi\item\mask & #LVIF_TEXT
            ;... Item text is being requested
            *pnmlvdi\item\pszText = @myItems(*pnmlvdi\item\iItem,0);*pnmlvdi\item\iSubItem)
          EndIf
        Case #LVN_ODFINDITEM
          result = -1
          Protected *nmlvfinditem.NMLVFINDITEM = lParam
          If *nmlvfinditem And *nmlvfinditem\lvfi\psz
            Protected text.s = PeekS(*nmlvfinditem\lvfi\psz)
            For i=0 To #ItemCount
              If myItems(i,0) = text
                result = i
                Break
              EndIf
            Next i
          EndIf
      EndSelect
  EndSelect
  ProcedureReturn result
EndProcedure

Procedure FindLI(gadget, text.s)

  Protected pos, rect.RECT
  Protected item.LVFINDINFO
  item\flags = #LVFI_STRING ;| #LVFI_PARTIAL
  item\psz = @text
  pos = SendMessage_(GadgetID(gadget), #LVM_FINDITEM, -1, @item)
  If pos <> -1
    ;SendMessage_(GadgetID(gadget), #LVM_ENSUREVISIBLE,pos,0)
    header = SendMessage_(GadgetID(gadget),#LVM_GETHEADER,0,0)                 ; get header control
    GetClientRect_(header,headerRect.RECT)                                     ; get size of header control
    SendMessage_(GadgetID(gadget), #LVM_GETITEMRECT,  0 , @rect)               ; get rect for item 0
    SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0, rect\top-headerRect\bottom) ; scroll to item 0 (minus header height)
    SendMessage_(GadgetID(gadget), #LVM_GETITEMRECT, pos, @rect)               ; get rect for our item
    SendMessage_(GadgetID(gadget), #LVM_SCROLL, 0, rect\top-headerRect\bottom) ; scroll to our item (minus header height)
  EndIf
 
EndProcedure
Aber ich bekomme es nicht hin das so anzupassen das es meinen wünschen entspricht. Garnicht so einfach.

Re: Arbeiten mit einer .CSV Datei

Verfasst: 15.05.2015 15:11
von ts-soft
HHYayo hat geschrieben:Doppelte identische Einträge gibt es nicht.
Damit waren mehrere Einträge ala VW gemeint, die selbstverständlich sich in anderen Kriterien unterscheiden können.

Das Callback wird so nicht funktionieren, das sucht meines Erachtens nach, nur ein Kriterium, du brauchst bis zu 14.
Ich kann Dir aber ab hier nicht mehr weiterhelfen, da ich zur Zeit mit Linux arbeite und da läuft das nicht.

Gruß
Thomas