Seite 1 von 1

ListViewGadget Konvertierungsfehler?

Verfasst: 03.07.2008 23:48
von teks
Hallo liebe PB Gemeinde,
ich bin neulich über eine nervige Eigenart des ListViewGadgets gestoßen.
Und zwar stellt er (jedenfalls bei mir) die Strings nicht 100% korrekt dar, in meinem Fall geht es speziell ums Tabulator -(ASCII Nr.9) Zeichen.

Folgendes Problem:
Ich habe eine .txt Datei mit ca. 800 Zeilen die Informationen über unsere Kunden enthalten.Die Struktur sieht in etwa so aus

<Test.txt>
Name d. Kunden Straße PLZ ORT TEL
Name d. Kunden2 Straße PLZ ORT TEL
Name d. Kunden3 Straße PLZ ORT TEL

Zwischen den einzelnen Elementen einer Zeile ist jeweils ein "TAB".
Nun lese ich die erste Zeile mit ReadLine(...) aus und Speicher sie beispielsweise in der Variablen Zeile1.s

Wenn ich nun die erste Zeile dem ListViewGadget hinzufüge, sehe ich zwischen Name d.Kunden und Straße keine Leerzechen (So wie in der txt datei), sondern lediglich einige Sonderzeichen wie. z.b. ASCII-Würfel (ich hoffe ihr wisst was ich meine).

Meine Frage ist also,wie kann ich den Text aus der *.txt-Datei 1:1 ins ListViewGadget übertragen, ohne die 800 Zeilen mühsam per Hand zu editieren?

Verfasst: 03.07.2008 23:54
von ts-soft
StringField und ReplaceString sollten helfen, ansonsten bitte einen
Beispielcode posten (+ Beispieltext), damit man es genauer erörtern kann.

Gruß
Thomas

Verfasst: 04.07.2008 02:09
von teks
öhm ok ich versuchs mal mit nem beispiel

Code: Alles auswählen

If OpenFile(0,"Test.txt")
  Debug ReadString(0,ReadStringFormat(0))
  CloseFile(0)
Else  
  MessageRequester("PureBasic", "Error: Can't read the file", 0)
EndIf
Test.txt:

Code: Alles auswählen

Muster Firma	MusterStraße 36 	89264 Weißenhorn 	09221/3864 	


Das gibt mein Debugger aus:(Und auch im ListViewGadget selbes Problem)
Bild

Wie man sieht sind zwischen Name,Straße,Plz und Tel keine Leerzeilen bzw.Tabs, sondern es werden die Sonderzeichen eingefügt und ich weiss nicht wie ich nun die Daten aus dem String Auslesen kann.
Würde der String genauso wiedergegeben werden wie er in der Test.txt-Datei gespeichert ist, wüsste ich an welcher Position im String sich jeweils die Straße,die PLZ und TelNr. befindet und könnte ganz einfach Mittels Mid(...) auslesen. Da es aber gerade nicht immer so einfach ist wie man sichs vorstellt renne ich gegen eine Wand :?

GREEZ Martin

Verfasst: 04.07.2008 04:14
von Bisonte
Also als erstes frage ich mich was das ReadStringFormat(0) soll...
Ich seh diesen Begriff zum ersten mal ;) naja also ich lese eine Textdatei Zeile für Zeile mit dieser Procedur ein :

Code: Alles auswählen

Structure hilfstring
  String.s
EndStructure

Global NewList Z.hilfstring()

Procedure.l TextFileRead(Filename.s)

Protected Nr.l

  ClearList(Z())
  
  Nr=ReadFile(#PB_Any,Filename.s)
  
  If Nr
    
    While Eof(Nr)=0
      
      AddElement(Z())
      Z()\String=ReadString(Nr)
      
    Wend
    
    CloseFile(Nr)
    
  EndIf
  
ProcedureReturn CountList(Z())
EndProcedure
Die Prozedur gibt dann die Anzahl der Zeilen zurück die Gelesen wurden,
und in der LinkList Z() wären dann alle Zeilen. Wenn kein file gelesen werden konnte dann ist es wegen der gelöschten linklist Null.

Daraufhin kannst du dann das ganze in ein Listicongadget legen...

Code: Alles auswählen

ForEach Z()

  Musterfirma.s   = StringField(Z()\String,1," ")
  Musterstrasse.s = StringField(Z()\String,2," ")
  
  usw.

  AddGadgetItem(#ListIcon,-1,Musterfirma + Chr(10) + Musterstrasse usw...) 

Next
wobei zwischen den einzelnen Spalten im ListIcon immer ein CHR(10) mit eingegeben werden muss,
da es sonst alles in die erste Spalte rutscht...

Allerdings solltest du zwischen deinen daten wie Strasse,Name usw nicht Leerzeichen zum
trennen nehmen sondern ein zeichen was nicht vorkommen kann bei den daten.
z.B. ein ; oder : oder aber auch *

War es das was dich plagt ?

Edit : Es sind wahrscheinlich CHR(9) zeichen (TABSTOPP) in deiner Textdatei.... daher sind es vermutlich diese eckigebn symbole...
Wenn man das mit nem Editor anschaut macht er dann leerzeichen daraus...

Verfasst: 04.07.2008 07:57
von ts-soft
Bisonte hat geschrieben:Also als erstes frage ich mich was das ReadStringFormat(0) soll...
Vielleicht mal in der Hilfe nachschauen? Sollte bei Textdateien immer
benutzt werden, wenn man diese nicht selbst erstellt hat.

@teks

Bei mir sieht Dein Text normal aus, vielleicht kannste mal den Text zippen
und irgendwo hochladen?

Re: ListViewGadget Konvertierungsfehler?

Verfasst: 04.07.2008 08:50
von Danilo
teks hat geschrieben:Zwischen den einzelnen Elementen einer Zeile ist jeweils ein "TAB".
Nun lese ich die erste Zeile mit ReadLine(...) aus und Speicher sie beispielsweise in der Variablen Zeile1.s
...und dann kannst Du mit ReplaceString alle Tabs umwandeln.

Code: Alles auswählen

Zeile1 = ReplaceString(Zeile1,#TAB$,"  ")
Oder bei Deinem anderen Beispiel:

Code: Alles auswählen

If OpenFile(0,"Test.txt")
  Debug ReplaceString(ReadString(0,ReadStringFormat(0)),#TAB$," ")
  CloseFile(0)
Else 
  MessageRequester("PureBasic", "Error: Can't read the file", 0)
EndIf
Damit kannst Du es ganz einfach in ein ListViewGadget bekommen.
Die Daten werden so aber wahrscheinlich nicht sehr ansehnlich sein,
weshalb es vielleicht doch besser wäre ein ListIconGadget mit 5 Spalten
zu nehmen.

Hier mal ein ganz simples Beispiel, das Du sicherlich leicht an Deine
Bedürfnisse anpassen kannst:

Code: Alles auswählen

Procedure.s ManyTabsToChr10(string.s)
  Define finalstring.s
  *p.character = @string    ; string-adresse nach *p
  While *p\c                ; solange das Zeichen *p\c nicht 0 ist
    If *p\c = #TAB          ; wenn #tab gefunden
      finalstring + Chr(10) ; erstes #tab durch chr(10) in finalstring ersetzen für ListIconGadget
      While *p\c = #TAB : *p+SizeOf(Character) : Wend ; solange #tab gefunden, naechstes zeichen
    Else
      finalstring + Chr(*p\c) ; Zeichen zu finalstring hinzufuegen
      *p+SizeOf(character)    ; naechstes zeichen
    EndIf
  Wend
  ProcedureReturn finalstring
EndProcedure

Line$ = "Muster Firma"+#TAB$+#TAB$+#TAB$+"MusterStraße 36"+#TAB$+#TAB$+#TAB$+"89264"+#TAB$+#TAB$+#TAB$+"Weißenhorn"+#TAB$+#TAB$+#TAB$+"09221/3864"+#TAB$+#TAB$+#TAB$

If OpenWindow(0,0,0,600,300,"Liste",#PB_Window_Normal|#PB_Window_ScreenCentered)
  If CreateGadgetList(WindowID(0))

    ListIconGadget(0,5,5,590,290,"Name",110)
    AddGadgetColumn(0,1,"Strasse",110)
    AddGadgetColumn(0,2,"PLZ",110)
    AddGadgetColumn(0,3,"Stadt",110)
    AddGadgetColumn(0,4,"Tel.Nr.",110)

    AddGadgetItem(0,-1,ManyTabsToChr10(Line$))

    Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow

  Else
    MessageRequester("Fehler","Gadgetliste kann nicht erstellt werden")
  EndIf
Else
  MessageRequester("Fehler","Fenster kann nicht geöffnet werden")
EndIf
Wenn es wirklich immer nur 1 Tab ist, dann reicht natürlich ein simples
'zeile = ReplaceString(zeile,#TAB$,Chr(10))' um den String fürs ListIconGadget
aufzubereiten. In Deinem Bild sieht das aber nicht nur wie 1 Tab aus.

Verfasst: 04.07.2008 11:50
von teks
Danke für die schnelle Antwort, ich hab es jetzt so gelöst wie von Danilo vorgeschlgen, thx nochmal

greez Martin

Verfasst: 04.07.2008 23:32
von Bisonte
ts-soft hat geschrieben:
Bisonte hat geschrieben:Also als erstes frage ich mich was das ReadStringFormat(0) soll...
Vielleicht mal in der Hilfe nachschauen? Sollte bei Textdateien immer
benutzt werden, wenn man diese nicht selbst erstellt hat.
Ja Sorry,seit PB3.3 hab ich nicht mehr Fileoperationen in der Hilfe nachschauen muessen ;) habs halt nie gebraucht....