File-Ops für .txt /.csv

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
OptimusPrime
Beiträge: 43
Registriert: 07.03.2005 16:52

File-Ops für .txt /.csv

Beitrag von OptimusPrime »

Die FileLength() ermittelt die Länge der Datei in Zeilen. (logisch:)

Die CompareFiles() vergleicht zwei Dateien zeilenweise, wenn der
Inhalt der älteren in der der neueren Datei komplett enthalten ist.
D.h. es prüft nur auf neue Einträge irgendwo in der Datei, doppelte
werden nur einmal angezeigt und ausgegeben.
Ich brauche das z.B. für das prüfen auf Updates einer Filelist.

Die SearchDoubles() sucht natürlich nach doppelten Einträgen in einer Datei (ebenfalls Zeilenweise) und gibt diese aus.

Vielleicht kann das noch Jemand gebrauchen oder erweitern...
Mfg

Edit : Nun mit Fehlerhandling.

Code: Alles auswählen


Procedure FileLength(filenr,filename$)
  
  If ReadFile(filenr,filename$) 
    While Eof(filenr)=0
      ReadString()
      filelen+1
    Wend
    CloseFile(filenr)
  Else 
    ErrorMessage("Read",filename$)
  EndIf
  ProcedureReturn filelen
  
EndProcedure



Procedure CompareFiles(filenr_old,filename_old$,filenr_new,filename_new$,filenr_out,filename_out$)

  filelen_old=FileLength(filenr_old,filename_old$)
  filelen_new=FileLength(filenr_new,filename_new$)
  
  Dim File_old.s(filelen_old-1)
  If ReadFile(filenr_old,filename_old$)
    counter=0
    While Eof(filenr_old)=0  
      input_old$=Trim(ReadString())
      File_old(counter)=input_old$
      counter+1
    Wend
    CloseFile(filenr_old)
  Else
    ErrorMessage("Read",filename_old$) 
  EndIf
   
  Dim File_new.s(filelen_new-1)
  If ReadFile(filenr_new,filename_new$)
    counter=0
    While Eof(filenr_new)=0  
      input_new$=Trim(ReadString())
      File_new(counter)=input_new$
      counter+1
    Wend
    CloseFile(filenr_new)
  Else
    ErrorMessage("Read",filename_new$) 
  EndIf

  If CreateFile(filenr_out,filename_out$) 
    counter=0
    i=0
    While i < filelen_new
      a$=File_new(i)
      k=0
      While k < filelen_old 
        b$=File_old(k)
        If a$=b$
          counter=1
          k+1
          Break
        EndIf
        k+1
      Wend
      If counter=0
        WriteStringN(a$)
      EndIf
      counter=0
      i+1
    Wend
    CloseFile(filenr_out)
  Else
    ErrorMessage("Create",filename_out$) 
  EndIf
 
EndProcedure


Procedure SearchDoubles(filenr,filename$,filenr_out,filename_out$)

  filelen=FileLength(filenr,filename$)
  
  Dim File.s(filelen-1)
  If ReadFile(filenr,filename$)
    counter=0
    While Eof(filenr)=0  
      input$=Trim(ReadString())
      File(counter)=input$
      counter+1
    Wend
    CloseFile(filenr)
  Else
    ErrorMessage("Read",filename$) 
  EndIf
  
  If CreateFile(filenr_out,filename_out$) 
    counter=0
    i=0
    While i < filelen
      a$=File(i)
      k=0
      While k < filelen
        b$=File(k)
        If a$=b$
          counter+1
        EndIf
        k+1
      Wend
      If counter>1
        WriteStringN(a$)
      EndIf
      counter=0
      i+1
    Wend
    CloseFile(filenr_out)
  Else
    ErrorMessage("Create",filename_out$) 
  EndIf
  
EndProcedure

Procedure ErrorMessage(error_type$,error_filename$)
  
  MessageRequester("ERROR","Could Not "+error_type$+" File : "+error_filename$ ,0)  
  
EndProcedure

Zuletzt geändert von OptimusPrime am 28.01.2006 16:03, insgesamt 4-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 3054
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Du solltest das alles dahingehend überarbeiten, dass du immer überprüfen solltest, ob OpenFile(), ReadFile() und ganz besonders CreateFile() erfolgreich aufgerufen wurden, bevor du irgendwelche Operationen an ihnen durchführst.
OptimusPrime
Beiträge: 43
Registriert: 07.03.2005 16:52

Beitrag von OptimusPrime »

Danke, habs angepasst :mrgreen:
Antworten