Seite 1 von 1

File-Ops für .txt /.csv

Verfasst: 28.01.2006 04:59
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


Verfasst: 28.01.2006 10:44
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.

Verfasst: 28.01.2006 15:50
von OptimusPrime
Danke, habs angepasst :mrgreen: