hallo,
kann man leere zeilen aus einer txt löschen lassen? also können bestimmt, aber wie?
hallo,
kann man leere zeilen aus einer txt löschen lassen? also können bestimmt, aber wie?
Eine leere Zeile ist meistens nicht leer. Darin liegt das Problem. Zum Beispiel wenn Tabs in der Zeile oder einfach nur Blanks drinstehen und ansonsten nichts Sichtbares. Würde nichts drinstehen könnte es so aussehen:
[autoit]$file = fileopen(@scriptDir&"\test.txt",0)
$file2= fileopen(@scriptDir&"\tmp.txt",2)
SetError(0)
If $file and $file2 then
$i = 1
while 1
$content = FileReadLine($file,$i)
If @error = -1 then ExitLoop
If StringLen($content)> 0 then
FileWriteLine($file2,$content)
Endif
$i = $i +1
wend
FileClose($file)
FileClose($file2)
If FileMove(@scriptDir&"\tmp.txt",@scriptDir&"\test.txt",1) then
FileDelete(@scriptDir&"\tmp.txt")
EndIf
Endif
Aber, wie gesagt, es funktioniert nur wenn nichts in der Zeile steht. Man kann die ganzen Ausnahmen abfragen, doch das denke ich ist mühsehlig.
Grundkonzept:
Wenn du es selbst machen willst dann ignorier dieses Beispiel hier:
;Dateipfad zur bearbeitenden Datei angeben
$TxtDateiPfad = 'Textdatei.txt'
;Datei auslesen
$FileHandle = FileOpen($TxtDateiPfad, 0)
$Text = FileRead($FileHandle)
FileClose($FileHandle)
;Leerzeilen entfernen
$Text = StringAddCR(StringRegExpReplace(StringStripCR($Text), '\n([\n\s]*\n)', Chr(10)))
;Datei neu schreiben
$FileHandle = FileOpen($TxtDateiPfad, 2)
FileWrite($FileHandle, $Text)
FileClose($FileHandle)
Edit:
Hm - wie immer hier - mal wieder zu spät... :weinen:
@AsperinJunkie
Das sagt einer der immer schneller ist
Wenn dir bekannt ist, welche Zeile leer ist:
[autoit]#include <File.au3>
_FileWriteToLine ( $sFile, $ZeilenNummer, "", 1 )
Damit wird die Zeile gelöscht.
Alternativ, wie oben schon angeführt, einlesen in Array. Dann mit meiner Funktion:
_Array2DEmptyDelete()
alle leeren Einträge löschen. Anschließend mit _FileWriteFromArray() zurückschreiben.
danke für die tips, werd es morgen probieren.
aber es steht wirklich nix in der leerzeile (da ich sie selber schreiben = @CRLF)
von daher kann ich die ausnahmen ignorieren *g*
bin dann mal zuversichtlich =)
Wenn du @CRLF nutzt das wird das kein Problem sein.
Hi!
[autoit]FileWrite("C:\test.txt", StringReplace(FileRead("C:\test.txt"), @CRLF & @CRLF, @CRLF))
[/autoit]Nicht getestet, müsste aber eigentlich gehen... peethebee
ZitatOriginal von peethebee
[autoit]
Hi!FileWrite("C:\test.txt", StringReplace(FileRead("C:\test.txt"), @CRLF & @CRLF, @CRLF))
[/autoit]Nicht getestet, müsste aber eigentlich gehen...
peethebee
Eine Datei zum Schreiben *und* Lesen öffnen?
Lt. deutscher Hilfe geht das nicht:
"Eine Datei kann nur entweder im Lese- oder im Schreibmodus geöffnet sein - sie kann nicht in beiden sein."
MfG. Oscar
Hi!
Kann es gerade nicht ordentlich testen, aber ich glaube, dass FileRead ohne vorheriges FileOpen die Datei direkt wieder schließt und sie damit für das folgende FileWrite wieder verfügbar ist.
peethebee
Oh, stimmt!
"Wenn ein Dateiname statt eines Dateihandles angegeben wird, wird die Datei während des Funktionsaufrufes geöffnet und geschlossen."
Das hatte ich glatt überlesen.
Somit sollte Deine Funktion doch klappen.
Aber...
"Wenn du große Textdateien bearbeitest, ist das natürlich viel langsamer als die Arbeit mit Handles."
Kommt halt auf die Dimensionen an.
MfG. Oscar
Hi,
nein, das geht nicht.
So long,
Mega
ZitatOriginal von OscarAber...
"Wenn du große Textdateien bearbeitest, ist das natürlich viel langsamer als die Arbeit mit Handles."
Kommt halt auf die Dimensionen an.
Das trifft für diesen Fall hier nicht zu.
Dateibearbeitungen mit einem Dateihandle sind nur dann schneller wenn mehrere Aktionen mit der Datei durchgeführt werden sollen (z.B. jede Zeile einzeln mit FileReadLine() auslesen oder so).
Einfach weil in diesem Fall die Datei nur einmal geöffnet wird und für alle Aktionen bereits ein Dateizeiger existiert.
Spricht man die Funktionen nur mit dem Dateipfad an wird bei jeder dieser Funktion intern erst die Datei geöffnet und mit einem internen Dateizeiger weitergearbeitet und das ganze wieder geschlossen.
Die Größe der Datei ist dabei unbedeutend - es kommt nur auf die Anzahl der Funktionsaufrufe mit dieser Datei an.
Bedeutet im Klartext:
[autoit]$Text = FileRead("C:\Test.txt")
[/autoit]entspricht intern ungefähr:
[autoit]$FileHandle = FileOpen("C:\Test.txt", 0)
$Text = FileRead($FileHandle)
FileClose($FileHandle)
Da bei Pee´s Methode mit der Datei jeweils nur eine Aktion durchgeführt wird ist sie also etwa genauso schnell als würde man mit einer Extra Variablen für das Dateihandle arbeiten - allerdings vom Code her deutlich kürzer.
Hallo,
So gehts auf jeden Fall:
[autoit]$aszFile = StringSplit(FileRead("C:\test.txt"),@CRLF,1)
$fhOutput = FileOpen("C:\test.txt",2)
For $i = 1 To $aszFile[0]
If StringLen(StringStripWS($aszFile[$i],8)) Then
FileWriteLine($fhOutput,$aszFile[$i])
EndIf
Next
FileClose($fhOutput)
Hi,
bernd dann wird aber eine Leerzeile angehängt oder nicht?
Hier so ginge es mit wenigen Zeilen auch, ist aber auch nicht gerade schnell.
#include<Array.au3>
#include<File.au3>
Global $pfad = @ScriptDir & '\leerzeilen.txt', $lines_A
_FileReadToArray($pfad, $lines_A)
For $i = UBound($lines_A) - 1 To 1 Step - 1
If Not StringRegExp($lines_A[$i], '[^\s]', 0) Then _ArrayDelete($lines_A, $i)
Next
_FileWriteFromArray($pfad, $lines_A, 1)
So long,
Mega
dank euch für die antworten, klappt alles =)
ich suche nun aber noch ne möglichkeit, doppelte einträge zu löschen ... mitm umschreiben harperts noch, dachte es wäre einfacher *g*
hat wer nen ansatz?
Hi,
Datei in ein Array lesen und dann
[autoit]Func _ArrayUnique(ByRef $aArray, $vDelim = '', $iBase = 1, $iUnique = 1)
If $vDelim = '' Then $vDelim = Chr(01)
Local $sHold
For $iCC = $iBase To UBound($aArray) - 1
If Not StringInStr($vDelim & $sHold, $vDelim & $aArray[$iCC] & $vDelim, $iUnique) Then _
$sHold &= $aArray[$iCC] & $vDelim
Next
Return StringSplit(StringTrimRight($sHold, StringLen($vDelim)), $vDelim)
EndFunc ;==>_ArrayUnique
und dann zurückschreiben.
So long,
Mega
danke, klappt =)
HI,
siehste.
Gern geschehen!
So long,
Mega
kann man das auch so modifizieren, das er, wo es doppelte einträge gibt, beide einträge löscht und nur einen string zurückgibt, der von anfang an nur 1 mal enthalten war ?