Seite 1 von 6

Textfile *.txt Bearbeiten

Verfasst: 16.11.2010 11:49
von Velindos
Hallo,
habe mir aus dem CCleaner ein Textfile erstellt mit meinen installierten Programmen. Möche jetzt die Datei einlesen. Funktioniert nicht mit den angeführten Beispielen. Anscheinend ist das Trennzeichen ein anderes (TabStop).
Will diese *.txt in Still einer Datenbank(Zeile per Datensatz mit Button vor/zurück/Speichern etc.) bearbeiten, weiss jemand ein Beispiel oder tips, Danke.

Gruss .......... Velindos

Re: Textfile *.txt Bearbeiten

Verfasst: 16.11.2010 12:13
von Kiffi
hier ein kleiner Hack:

Code: Alles auswählen

EnableExplicit
#myWindow = 0
#myListIconGadget = 0

OpenWindow(#myWindow, #PB_Ignore, #PB_Ignore, 640, 480, "")
ListIconGadget(#myListIconGadget, 0, 0, 640, 480, "Deinstallierbare Programme", 100)
AddGadgetColumn(#myListIconGadget, 1, "Hersteller", 100)
AddGadgetColumn(#myListIconGadget, 2, "Installiert am", 100)
AddGadgetColumn(#myListIconGadget, 3, "Größe", 100)
AddGadgetColumn(#myListIconGadget, 4, "Version", 100)

Define Zeile.s
Define FF
Define Quit
Define WWE

FF = ReadFile(#PB_Any, "d:\install.txt") ; Pfad anpassen!

If FF
  
  While Not Eof(FF)
    
    Zeile = ReadString(FF, #PB_Unicode)
    Zeile = ReplaceString(Zeile, #TAB$, #LF$)
    
    AddGadgetItem(#myListIconGadget, -1, Zeile)
    
  Wend  
  
  CloseFile(FF)

Else
  
  Debug "install.txt konnte nicht geladen werden"
  
EndIf

Repeat
  
  WWE = WaitWindowEvent()
  
  Select WWE
    Case #PB_Event_CloseWindow
      Quit = #True
  EndSelect
  
Until Quit = #True
Ich habe mal quick'n dirty alle TAB (#TAB$) gegen LF (#LF$) ausgetauscht. Dann kann man die Zeilen
so wie sie sind aus dem Stand in ein ListIconGadget einfügen.

Hinweis 1: Die install.txt ist in UTF-16LE mit Signatur (BOM) gespeichert. Destawegen musst Du
#PB_Unicode als Extraparameter bei ReadString() mit angeben

Hinweis 2: Wenn Du die Felder selber auseinanderschnippeln willst, dann schau Dir mal
CountString() und StringField() an.

Grüße ... Kiffi

Re: Textfile *.txt Bearbeiten

Verfasst: 16.11.2010 14:51
von Velindos
Hallo,
danke für deinen Vorschlag, der funktioniert!!!!!!!!!!!

Bin gerade beim Tüffteln wie ich die Sache mit meinen Vorstellungen übereinbringe und habe
gleich mit den Aufruf der Fenster zu tun, egal.
Um dir mein Problem zu schildern gebe ich mal den Code rein.

Code: Alles auswählen

; PureBasic Visual Designer v3.95 build 1485 (PB4Code)
; Projekt:Install Forms zur Bearbeitung der install.txt
; Author: F.G.Maringer
; Date:   16-11-2010
; OS:     Windows7-64Bit
; Demo:   No


;IncludeFile "Windows1.pb"


Enumeration
  #Window_0
EndEnumeration

;- Gadget Constants
;
Enumeration
  #Text_0
  #T_ID
  #T_Software
  #T_Hersteller
  #T_Datum
  #B_Exit
  #B_Start
  #B_Return
  #B_Vor
  #B_Ende
  #B_Neu
  #B_Find1
  #B_Find2
  #B_Lesen
  #B_Schreiben
  #B_Neu2
  #B_Dateiladen
  #B_DateiSpeichern
  #B_DateiLoeschen
  #B_DateiKopieren
  #Text_11
  #Text_2
  #Text_3
  #Text_4
  #Text_5
  #T_Umfang
  #T_Version
  #Frame3D_0
  #B_OpenDatei
EndEnumeration

;Begin Proceduren    ***************************************************
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 266, 29, 640, 480, "VelindosDATA",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      TextGadget(#Text_0, 60, 70, 75, 15, "Software")
      StringGadget(#T_ID, 120, 260, 45, 25, "ID")
      StringGadget(#T_Software, 150, 65, 250, 20, "Software")
      StringGadget(#T_Hersteller, 150, 95, 250, 20, "Hersteller")
      StringGadget(#T_Datum, 150, 130, 250, 20, "Datum")
      ButtonGadget(#B_Exit, 415, 5, 40, 25, "Exit")
      ButtonGadget(#B_Start, 45, 260, 30, 25, "|<")
      ButtonGadget(#B_Return, 80, 260, 30, 25, "<")
      ButtonGadget(#B_Vor, 170, 260, 30, 25, ">")
      ButtonGadget(#B_Ende, 205, 260, 30, 25, ">|")
      ButtonGadget(#B_Neu, 10, 70, 30, 175, ">||")
      ButtonGadget(#B_Find1, 415, 55, 40, 25, "Find")
      ButtonGadget(#B_Find2, 415, 210, 40, 25, "Find")
      ButtonGadget(#B_Lesen, 315, 260, 60, 25, " Lesen")
      ButtonGadget(#B_Schreiben, 380, 260, 65, 25, "Schreiben")
      ButtonGadget(#B_Neu2, 245, 260, 60, 25, "Neu")
      ButtonGadget(#B_Dateiladen, 85, 10, 55, 20, "Laden")
      ButtonGadget(#B_DateiSpeichern, 145, 10, 60, 20, "Speichern")
      ButtonGadget(#B_DateiLoeschen, 210, 10, 60, 20, "Löschen")
      ButtonGadget(#B_DateiKopieren, 275, 10, 60, 20, "Kopieren")
      TextGadget(#Text_11, 5, 10, 75, 15, "Velindos Datei")
      TextGadget(#Text_2, 60, 100, 75, 15, "Hersteller")
      TextGadget(#Text_3, 60, 135, 75, 15, "Datum")
      TextGadget(#Text_4, 60, 175, 75, 15, "Umfang")
      TextGadget(#Text_5, 60, 210, 75, 15, "Version")
      StringGadget(#T_Umfang, 150, 170, 250, 20, "Umfang")
      StringGadget(#T_Version, 150, 205, 250, 20, "Version")
      Frame3DGadget(#Frame3D_0, 55, 50, 355, 185, "")
      ButtonGadget(#B_OpenDatei, 340, 10, 60, 20, "OpenFile")
      
    EndIf
  EndIf
EndProcedure

Procedure OFile(file.s) 
  
   d=ReadFile(1, file) 
    If d 
      While Eof(1)=0 
        Text$ = Text$+ReadString(1)+Chr(13)+ Chr(10) 
      Wend 
      CloseFile(1) 
      SetGadgetText(2, Text$) 
      Else 
      MessageRequester("Error","No valid file was selected.",#MB_ICONERROR) 
    EndIf 
EndProcedure 

Procedure Open_Windows_2 ()
  
If OpenWindow(0, 100, 200, 495, 260, "Open Small Files Example", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget) 

CreateGadgetList(WindowID(0)) 

ButtonGadget(1,210,20,80,25,"Open File") 
StringGadget(2,10,60,480,185,"",#ES_MULTILINE | #ES_AUTOVSCROLL|#WS_VSCROLL|#WS_HSCROLL) 

;TextGadget(2,10,60,480,185,"",#PB_Text_Border ) 

  Repeat 
    EventID.l = WaitWindowEvent() 
    If EventID = #PB_Event_CloseWindow  
      Quit = 1 
    EndIf 
    If EventID = #PB_Event_Gadget 
      Select EventGadget() 
        Case 1 
          file$ = OpenFileRequester("Open File","","All Files|*.*",1) 
          OFile(file$) 
      EndSelect 
    EndIf 
  Until Quit = 1 
  
EndIf 

End    

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
EndProcedure


;Datei Laden => B_Laden
Procedure Laden()

EndProcedure

;Datei Speichern => B_Speichern
Procedure Speichern()

EndProcedure

;Datei Löschen => B_Loeschen
Procedure Loeschen()

EndProcedure

;Datei Kopieren => B_Kopieren
Procedure Kopieren()

EndProcedure

;Datei Open => B_OpenDatei
Procedure OpenDatei()

EndProcedure

;Datensatz_Erster => B_Erster
Procedure DS_Erster()

EndProcedure

;Datensatz_Vor => B_Vor
Procedure DS_Vor()

EndProcedure

;Datensatz_Return => B_Return
Procedure DS_Return()

EndProcedure

;Datensatz_End => B_End
Procedure DS_End()
  
  EndProcedure
  
;Datensatz_Neu => B_Neu
Procedure DS_Neu()
  
  EndProcedure

;Datensatz_Lesen => B_Lesen
Procedure DS_Lesen()
  
  EndProcedure
  
  ;Datensatz_Schreiben => B_Schreiben
Procedure DS_Schreiben()
  
EndProcedure

;Datensatz_Markieren => B_Marker
Procedure DS_Markieren()
  
  EndProcedure
  
  ;Datensatz_Find1 => B_Find1
Procedure DS_Find1()
  
  EndProcedure
  
  ;Datensatz_Find2 => B_Find2
Procedure DS_Find2()
  
  EndProcedure
  






;Begin Hauptprogramm ***************************************************
  
  
Open_Window_0()
    
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow: End
    Case #PB_Event_Gadget
      
      Select EventGadget()
          
        
      Case #B_Dateiladen:Open_Windows_2()
        
        
                  
        Case #B_Exit: End
                  
      EndSelect
  EndSelect
ForEver


;Ende Hauptprogramm ***************************************************
Werde dein Beispiel weiter studieren............

Gruss .................. Velindos

Re: Textfile *.txt Bearbeiten

Verfasst: 16.11.2010 15:42
von Kiffi
kurze Frage zwischendurch: Was nützt Dir das Bearbeiten
dieser Datei? Die Daten können sich doch nur durch eine
Installation oder eine Deinstallation von Software ändern.

Grüße ... Kiffi

Re: Textfile *.txt Bearbeiten

Verfasst: 16.11.2010 16:58
von Velindos
Hallo,

ist eine feine Sache zum lernen des Datei.txt handling unter PureBasic da ich Anfänger bin.
Möchte anhand dieses Beispiele die Software auslesen können und bearbeiten und in einer
getrennten Datei speichern.

Muss leider jetzt weg, wünsche noch einen schönen Abend und danke für deine Hilfe.

Gruss ............ Velindos

Re: Textfile *.txt Bearbeiten

Verfasst: 16.11.2010 17:02
von ts-soft
Leider hat Kiffi vergessen das "ReadStringFormat()" mit einzubauen, auch wenn das Format bereits bekannt ist,
und sei es nur, das der Dateizeiger sich hinter den BOM bewegt.

Gruß
Thomas

Re: Textfile *.txt Bearbeiten

Verfasst: 16.11.2010 17:17
von Kiffi
ts-soft hat geschrieben:Leider hat Kiffi vergessen das "ReadStringFormat()" mit einzubauen, auch wenn das Format bereits bekannt ist,
und sei es nur, das der Dateizeiger sich hinter den BOM bewegt.
ah, ja, danke für den Hinweis!

Grüße ... Kiffi

Re: Textfile *.txt Bearbeiten

Verfasst: 17.11.2010 08:50
von Velindos
Hallo Leute,
danke für eure ausgezeichnete Hilfe, komme mit "ReadStringFormat()" nicht ganz klar, überprüft ob Dateiposition einen BOM enthält, wie wendet man Sie an.
Also was habe ich gemacht, ich habe die Procedur von Kiffi in ein Beispiel von Bluespeed übernommen und assembliert. Jetzt kann ich Zeilenweise den String auf eine Variable geben.
Ich möchte jetzt die Datei bereits in Spalten und Zeilen in ein Array einlesen, gibt es dazu bereits Beispiele oder Übungen.
Wenn mir jemand helfen könnte, wäre ich ihm sehr verbunden. Als Denkansatz das aktuelle Beispiel:

Code: Alles auswählen

;*********************************************************************************
;*                              $ Files einlesen                                 *                                
;*                                Version 1.0.x                                  *
;*                             Assembliert by Velindos                           *
;*                                     2010                                      *
;*********************************************************************************
; WICHTIG: Damit dieser Text angezeigt werden kann, muss install.txt auf C:\
; vorhanden sein, ist eine feine Sache zum lernen des Datei.txt Handling unter 
; PureBasic da ich Anfänger bin. Möchte Anhand dieses Beispiele die Software 
; auslesen können und bearbeiten und in einer getrennten Datei speichern. 
; ReadFile(File,Ziel) genau wie OpenFile(), nur das wir die Datei diesmal nur lesen
; und anzeigen wollen und nicht erzeugen.
;
; Hinweis 1: Die install.txt ist in UTF-16LE mit Signatur (BOM) gespeichert. 
; Destawegen musst Du #PB_Unicode als Extraparameter bei ReadString() mit angeben



Dim Ausgabe.s(999)
Define Zeile.s

Define FF
Define Quit
Define WWE

;Hinweis 2: Wenn Du die Felder selber auseinanderschnippeln willst, 
;dann schau Dir mal CountString() und StringField() an.   
;Text$ = ReadString(#Datei [, Flags]) => Liest einen String
;Ergebnis = ReadFile(#Datei, DateiName$) => Öffnet eine existierende Datei 
;Ergebnis$ = StringField(String$, Index, Trennzeichen$) => Gibt den Feldinhalt 
;Ergebnis = CountString(String$, StringToCount$) => Gibt die Anzahl zurück
;String$ = ReplaceString(String$, SuchString$, ErsatzString$ [, Modus [, StartPosition]]) =>Vorkommen des 'SuchString$'zu finden 
;Ergebnis = ReadStringFormat(#Datei) =>Überprüft aktuelle Dateiposition ein BOM (Byte Order Mark) enthält 


FF = ReadFile(#PB_Any, "c:\install.txt")                            ; Pfad anpassen!

If ReadFile(0,"C:\Install.txt")                                     ; Wir öffnen die Datei pbtutorial.txt zum Lesen
    
        ;zeile$  =   ReadString(0)                                                         
        ;Ausgabe(1) = ReadString(FF, #PB_Unicode)
        
        Zeile = ReadString(FF, #PB_Unicode); Wir lesen die Zeichen auf Zeile  
        Ausgabe(1) = Zeile ;Geben Zeichen auf Array
        Zeile = ReplaceString(Zeile, #TAB$, #LF$) ; Vorkommen des 'SuchString$'zu finden 
        Debug StringField(Zeile, 1, " ") ;Zeigen uns Debuger an
        
        
       
        
  MessageRequester("Text","Text: "+Ausgabe(1),0)                    ; Nun zeigen wir die Zeichen an  
 
CloseFile(0)                                                        ; Wir schließen die Datei. Was jedoch nicht unbedingt
                                                                    ; sein muss, da PB sie auch automatisch schließt.   

Else                                                                ; Wenn die Datei nicht gefunden wurde

    MessageRequester("Fehler","Konnte die Datei nicht öffnen.",0)   ; Fehlermeldung

EndIf                                                              ; Ende der Abfrage




; ReadString() ist dazu da, um die verschiedenen Zeichen einer Zeile in der Datei zu 
; lesen. Buchstaben und Sonderzeichen werden hier einfach allgemein Zeichen genannt.

; Ich glaube, dass es für einen Einstieg in die File Library reicht, man kann das ganze 
; noch mit der FileSytem Library erweitern.


; Cu 
; Bluespeed



; 05. Juli 2003: Überarbeitete Sprache und Layout by André Beer - exklusiv für www.purearea.net
Gruss .......... Velindos

Re: Textfile *.txt Bearbeiten

Verfasst: 17.11.2010 11:13
von Velindos
Hallo,
habe ein Problem mit der Funktion "StringField". Kann den String nicht richtig zerlegen.
Wenn ich statt 2, 3 eingebe schneidet er nicht richtig ab.

String => ?7-Zip 4.65 (x64 edition) Igor Pavlov 16.08.2010 3,99MB 4.65.00.0
Anzeige ist einmal "?7-Zip" oder "(x64")!

Das ist nicht im Sinne des Erfinder. Komisch im ListIconGadget funkt das, unklar.

Gruss ................ Velindos

Re: Textfile *.txt Bearbeiten

Verfasst: 17.11.2010 11:40
von Kiffi
Velindos hat geschrieben:Das ist nicht im Sinne des Erfinder.
StringField() arbeitet genau so, wie sich der Erfinder das vorgestellt hat.

Wenn Du den String aus der Datei einliest, sieht er sinngemäß so aus:

Feld1[TAB]Feld2[TAB]Feld3[TAB]...

(wobei [TAB] für das Tabulatorzeichen (Chr(9) oder in PB: #TAB$) steht und den Delimiter darstellt)

Nun schau Dir noch einmal Deinen Aufruf an und lenke Deine Aufmerksamkeit
auf den von Dir angegebenen Delimiter.

Grüße ... Kiffi