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
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

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

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

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
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