Textfile *.txt Bearbeiten

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Textfile *.txt Bearbeiten

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Textfile *.txt Bearbeiten

Beitrag 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
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Textfile *.txt Bearbeiten

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Textfile *.txt Bearbeiten

Beitrag 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
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Textfile *.txt Bearbeiten

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Textfile *.txt Bearbeiten

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Textfile *.txt Bearbeiten

Beitrag 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
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Textfile *.txt Bearbeiten

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Textfile *.txt Bearbeiten

Beitrag 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
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Textfile *.txt Bearbeiten

Beitrag 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
a²+b²=mc²
Antworten