Arbeiten mit einer .CSV Datei

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Arbeiten mit einer .CSV Datei

Beitrag von Kiffi »

ich würde das nicht so kompliziert machen.

hier mal mein Vorschlag ohne Callback und Gebimsel:

Code: Alles auswählen

EnableExplicit

Structure sAuto
	Hersteller.s
	Baujahr.s
	PS.s
EndStructure

Global NewList Auto.sAuto()

Enumeration FormWindow
	#Window_0
EndEnumeration

Enumeration FormGadget
	#lblHerstellerFilter
	#txtHerstellerFilter
	#lblPsFilter
	#txtPsFilter
	#lblBaujahrFilter
	#txtBaujahrFilter
	#ligAutos
	#cmdFilter
EndEnumeration

Procedure OpenWindow_0()
	OpenWindow(#Window_0, 0, 0, 600, 400, "Alle meine Autos", #PB_Window_SystemMenu)
	TextGadget(#lblHerstellerFilter, 8, 8, 100, 25, "Hersteller:")
	StringGadget(#txtHerstellerFilter, 112, 8, 100, 25, "")
	TextGadget(#lblBaujahrFilter, 8, 40, 100, 25, "Baujahr:")
	StringGadget(#txtBaujahrFilter, 112, 40, 100, 25, "")
	TextGadget(#lblPsFilter, 8, 72, 100, 25, "PS:")
	StringGadget(#txtPsFilter, 112, 72, 100, 25, "")
	ListIconGadget(#ligAutos, 8, 112, 584, 280, "Hersteller", 100)
	AddGadgetColumn(#ligAutos, 1, "Baujahr", 100)
	AddGadgetColumn(#ligAutos, 2, "PS", 100)
	ButtonGadget(#cmdFilter, 232, 72, 100, 25, "Filtern")
EndProcedure

AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "100" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "200" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "300" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "100" : Auto()\Baujahr = "2010"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "200" : Auto()\Baujahr = "2010"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "300" : Auto()\Baujahr = "2010"

Procedure RefillList()
	
	ClearGadgetItems(#ligAutos)
	
	Protected Hersteller_OK, PS_OK, Baujahr_OK
	
	ForEach Auto()
		
		Hersteller_OK = #True
		If GetGadgetText(#txtHerstellerFilter) <> ""
			Hersteller_OK = FindString(Auto()\Hersteller, GetGadgetText(#txtHerstellerFilter)) 
		EndIf
		
		PS_OK = #True
		If GetGadgetText(#txtPsFilter) <> ""
			PS_OK = Bool(Auto()\PS = GetGadgetText(#txtPsFilter))
		EndIf
		
		Baujahr_OK = #True
		If GetGadgetText(#txtBaujahrFilter) <> ""
			Baujahr_OK = Bool(Auto()\Baujahr = GetGadgetText(#txtBaujahrFilter))
		EndIf
		
		If Hersteller_OK And PS_OK And Baujahr_OK
			AddGadgetItem(#ligAutos, -1, Auto()\Hersteller + #LF$ + Auto()\Baujahr + #LF$ + Auto()\PS)
		EndIf
		
	Next
	
EndProcedure

OpenWindow_0()

RefillList()

BindGadgetEvent(#cmdFilter, @RefillList())

Repeat
Until	WaitWindowEvent()=#PB_Event_CloseWindow
Grüße ... Peter
a²+b²=mc²
HHYayo
Beiträge: 25
Registriert: 14.05.2015 23:15

Re: Arbeiten mit einer .CSV Datei

Beitrag von HHYayo »

Kiffi hat geschrieben:ich würde das nicht so kompliziert machen.

hier mal mein Vorschlag ohne Callback und Gebimsel:

Code: Alles auswählen

EnableExplicit

Structure sAuto
	Hersteller.s
	Baujahr.s
	PS.s
EndStructure

Global NewList Auto.sAuto()

Enumeration FormWindow
	#Window_0
EndEnumeration

Enumeration FormGadget
	#lblHerstellerFilter
	#txtHerstellerFilter
	#lblPsFilter
	#txtPsFilter
	#lblBaujahrFilter
	#txtBaujahrFilter
	#ligAutos
	#cmdFilter
EndEnumeration

Procedure OpenWindow_0()
	OpenWindow(#Window_0, 0, 0, 600, 400, "Alle meine Autos", #PB_Window_SystemMenu)
	TextGadget(#lblHerstellerFilter, 8, 8, 100, 25, "Hersteller:")
	StringGadget(#txtHerstellerFilter, 112, 8, 100, 25, "")
	TextGadget(#lblBaujahrFilter, 8, 40, 100, 25, "Baujahr:")
	StringGadget(#txtBaujahrFilter, 112, 40, 100, 25, "")
	TextGadget(#lblPsFilter, 8, 72, 100, 25, "PS:")
	StringGadget(#txtPsFilter, 112, 72, 100, 25, "")
	ListIconGadget(#ligAutos, 8, 112, 584, 280, "Hersteller", 100)
	AddGadgetColumn(#ligAutos, 1, "Baujahr", 100)
	AddGadgetColumn(#ligAutos, 2, "PS", 100)
	ButtonGadget(#cmdFilter, 232, 72, 100, 25, "Filtern")
EndProcedure

AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "100" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "200" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lala" : Auto()\PS = "300" : Auto()\Baujahr = "2000"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "100" : Auto()\Baujahr = "2010"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "200" : Auto()\Baujahr = "2010"
AddElement(Auto()) : Auto()\Hersteller = "lulu" : Auto()\PS = "300" : Auto()\Baujahr = "2010"

Procedure RefillList()
	
	ClearGadgetItems(#ligAutos)
	
	Protected Hersteller_OK, PS_OK, Baujahr_OK
	
	ForEach Auto()
		
		Hersteller_OK = #True
		If GetGadgetText(#txtHerstellerFilter) <> ""
			Hersteller_OK = FindString(Auto()\Hersteller, GetGadgetText(#txtHerstellerFilter)) 
		EndIf
		
		PS_OK = #True
		If GetGadgetText(#txtPsFilter) <> ""
			PS_OK = Bool(Auto()\PS = GetGadgetText(#txtPsFilter))
		EndIf
		
		Baujahr_OK = #True
		If GetGadgetText(#txtBaujahrFilter) <> ""
			Baujahr_OK = Bool(Auto()\Baujahr = GetGadgetText(#txtBaujahrFilter))
		EndIf
		
		If Hersteller_OK And PS_OK And Baujahr_OK
			AddGadgetItem(#ligAutos, -1, Auto()\Hersteller + #LF$ + Auto()\Baujahr + #LF$ + Auto()\PS)
		EndIf
		
	Next
	
EndProcedure

OpenWindow_0()

RefillList()

BindGadgetEvent(#cmdFilter, @RefillList())

Repeat
Until	WaitWindowEvent()=#PB_Event_CloseWindow
Grüße ... Peter
Das ist eigentlich Haargenau das was ich suche!

Ich benutze diese Funktion um mein ListIcon mit den Daten zu füllen:

Code: Alles auswählen

Procedure LoadItems()
  Protected ReadFileString$
  Protected Column1$
  Protected Column2$
  Protected Column3$
  Protected Column4$
  Protected Column5$
  Protected Column6$
  Protected Column7$
  Protected Column8$
  Protected Column9$
  Protected Column10$
  Protected Column11$
  Protected Column12$
  Protected Column13$
  Protected Column14$  
  If ReadFile(1,"DB.csv")
    While Eof(1)=0
      ReadFileString$ = ReadString(1,0)
      Column1$ = StringField(ReadFileString$,1,";")
      Column2$ = StringField(ReadFileString$,2,";")
      Column3$ = StringField(ReadFileString$,3,";")
      Column4$ = StringField(ReadFileString$,4,";")
      Column5$ = StringField(ReadFileString$,5,";")
      Column6$ = StringField(ReadFileString$,6,";")
      Column7$ = StringField(ReadFileString$,7,";")
      Column8$ = StringField(ReadFileString$,8,";")
      Column9$ = StringField(ReadFileString$,9,";")
      Column10$ = StringField(ReadFileString$,10,";")
      Column11$ = StringField(ReadFileString$,11,";")
      Column12$ = StringField(ReadFileString$,12,";")
      Column13$ = StringField(ReadFileString$,13,";")
      Column14$ = StringField(ReadFileString$,14,";")
      
      AddGadgetItem(ListIcon_0,-1,Column1$+Chr(10)+Column2$+Chr(10)+Column3$+Chr(10)+Column4$+Chr(10)+Column5$+Chr(10)+Column6$+Chr(10)+Column7$+Chr(10)+Column8$+Chr(10)+Column9$+Chr(10)+Column10$+Chr(10)+Column11$+Chr(10)+Column12$+Chr(10)+Column13$+Chr(10)+Column14$)
    Wend
   
    CloseFile(1)
  EndIf
 
EndProcedure
Muss ich nun einfach statt AddGadgetItem das AddElement benutzen und die Liste dann mit deiner Refill Procedure füllen ?
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Arbeiten mit einer .CSV Datei

Beitrag von Kiffi »

in LoadItems() würde ich die LinkedList (einmalig) befüllen.

in RefillList() befüllst Du das ListIconGadget mit den Daten der LinkedList unter Berücksichtigung der Filter.

Grüße ... Peter
a²+b²=mc²
HHYayo
Beiträge: 25
Registriert: 14.05.2015 23:15

Re: Arbeiten mit einer .CSV Datei

Beitrag von HHYayo »

Funktioniert fast so wie es soll. Allerdings scheint er nur bis Ausführung die Eingaben anzunehmen. Sobald ich zum Beispiel Baujahr dazu nehmen zeigt er mir garnichts mehr an.

Warum ?

Code: Alles auswählen

Procedure RefillList()
   
   ClearGadgetItems(ListIcon_0)
   
   Protected Marke_OK, Serie_OK, Ausfuehrung_OK, Modell_OK, Art_OK, Leistung_OK, Getriebe_OK, Hersteller_OK, Baureihe_OK, Stgnrh_OK, Stgnrs_OK, Softwarestand_OK, LeseHardware_OK, Info_OK
   
   ForEach Auto()
      
      Marke_OK = #True
      If GetGadgetText(String_Marke) <> ""
         Marke_OK = FindString(Auto()\Marke, GetGadgetText(String_Marke))
      EndIf
      
      Serie_OK = #True
      If GetGadgetText(String_Serie) <> ""
         Serie_OK = Bool(Auto()\Serie = GetGadgetText(String_Serie))
      EndIf
      
      Ausfuehrung_OK = #True
      If GetGadgetText(String_Ausfuehrung) <> ""
         Ausfuehrung_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Ausfuehrung))
       EndIf
       
      Modell_OK = #True
      If GetGadgetText(String_Baujahr) <> ""
         Modell_OK = FindString(Auto()\Marke, GetGadgetText(String_Baujahr))
      EndIf
      
      Art_OK = #True
      If GetGadgetText(String_Art) <> ""
         Art_OK = Bool(Auto()\Serie = GetGadgetText(String_Art))
      EndIf
      
      Leistung_OK = #True
      If GetGadgetText(String_Leistung) <> ""
         Leistung_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Leistung))
       EndIf
       
      Getriebe_OK = #True
      If GetGadgetText(String_Getriebe) <> ""
         Getriebe_OK = FindString(Auto()\Marke, GetGadgetText(String_Getriebe))
      EndIf
      
      Hersteller_OK = #True
      If GetGadgetText(String_Hersteller) <> ""
         Hersteller_OK = Bool(Auto()\Serie = GetGadgetText(String_Hersteller))
      EndIf
      
      Baureihe_OK = #True
      If GetGadgetText(String_Baureihe) <> ""
         Baureihe_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Baureihe))
       EndIf
       
      Stgnrh_OK = #True
      If GetGadgetText(String_Stgnrh) <> ""
         Stgnrh_OK = FindString(Auto()\Marke, GetGadgetText(String_Stgnrh))
      EndIf
      
      Stgnrs_OK = #True
      If GetGadgetText(String_Stgnrs) <> ""
         Stgnrs_OK = Bool(Auto()\Serie = GetGadgetText(String_Stgnrs))
      EndIf
      
      Softwarestand_OK = #True
      If GetGadgetText(String_Softwarestand) <> ""
         Softwarestand_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Softwarestand))
       EndIf
       
       LeseHardware_OK = #True
      If GetGadgetText(String_LeseHardware) <> ""
         LeseHardware_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_LeseHardware))
       EndIf
       
      Info_OK = #True
      If GetGadgetText(String_Info) <> ""
         Info_OK = Bool(Auto()\Ausfuehrung = GetGadgetText(String_Info))
      EndIf
      
      If Marke_OK And Serie_OK And Ausfuehrung_OK And Modell_OK And Art_OK And Leistung_OK And Getriebe_OK And Hersteller_OK And Baureihe_OK And Stgnrh_OK And Stgnrs_OK And Softwarestand_Ok And LeseHardware_OK And Info_OK
         AddGadgetItem(ListIcon_0, -1, Auto()\Marke + #LF$ + Auto()\Serie + #LF$ + Auto()\Ausfuehrung + #LF$ + Auto()\Baujahr + #LF$ + Auto()\Art + #LF$ + Auto()\Leistung + #LF$ + Auto()\Getriebe + #LF$ + Auto()\Hersteller + #LF$ + Auto()\Baureihe + #LF$ + Auto()\Stgnrh + #LF$ + Auto()\Stgnrs + #LF$ + Auto()\Softwarestand + #LF$ + Auto()\LeseHardware + #LF$ + Auto()\Info)
      EndIf
      
   Next
   
 EndProcedure
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Arbeiten mit einer .CSV Datei

Beitrag von NicTheQuick »

Wenn du einfach nur auf Gleichheit prüfst, dann kannst du auch nur nach kompletten Strings suchen. Schlauer wäre es, überall FindString zu benutzen, wie bei Marke_OK.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Arbeiten mit einer .CSV Datei

Beitrag von Kiffi »

NicTheQuick hat geschrieben:Wenn du einfach nur auf Gleichheit prüfst, dann kannst du auch nur nach kompletten Strings suchen. Schlauer wäre es, überall FindString zu benutzen, wie bei Marke_OK.
ich habe bei PS und Baujahr auf Gleicheit (Bool()) geprüft (ist meines Erachtens sinnvoll). So Sachen wie Hersteller oder Marke sollten natürlich besser mit FindString() überprüft werden.

Grüße ... Peter
a²+b²=mc²
HHYayo
Beiträge: 25
Registriert: 14.05.2015 23:15

Re: Arbeiten mit einer .CSV Datei

Beitrag von HHYayo »

Habe das Problem gefunden. Habe vergessen die Variablen aus der Liste Auto() anzupassen. Jetzt funktioniert die Geschichte wie sie soll! Ich würde aber auch gerne Abweichungen einbauen, sprich wenn das es zum Beispiel ausreichen würde einfach "2.0" anzugeben statt "2.0 TDI". Das ich habe nur das Problem das wenn ich Bool versuche mit FindString auszutauschen das er denn sagt "Comparison are only compatible with keywords like.."

Muss ich das FindString im Bool setzen ?

// EDIT //

Problem auch gelöst!
Benutzeravatar
Didelphodon
Beiträge: 360
Registriert: 18.12.2004 13:03
Wohnort: Wien
Kontaktdaten:

Re: Arbeiten mit einer .CSV Datei

Beitrag von Didelphodon »

@hhyago ...
Nur mal so als Gedanke zwischendurch, warum verwendest Du für die Aufgabe eigentlich nicht einfach Excel? Das wäre das "perfekte" Tool dafür, imho.
Das Leben ist ein sch*** Spiel, aber die Grafik ist irre!
Fighting for peace is like fuc*ing for virginity!
Antworten