2016-05-12 6 views
0

Ich habe nach einer Lösung für dieses gesucht, aber alle, die ich gefunden habe, sind entweder viel mehr als ich brauche oder nicht genau das, was ich will.Entfernen von CR/LF am Ende der Datei in VB.net

Ich habe Dateien, die ich anhängen möchte. Ich muss an das Ende der letzten Zeile anhängen, aber sie haben alle einen Wagenrücklauf und so werde ich am Ende an die neue Zeile angehängt, wenn ich nur wie gewohnt anhänge.

Alles, was ich will, ist eine Subroutine, die einen Dateipfad und entfernt die CR/LF am Ende davon, nicht mehr und nicht weniger. Jede Hilfe, die mich auf eine Lösung hinweist, wäre willkommen. Ich bin überrascht, dass es dafür keine integrierte Funktion gibt.

+0

Haben Sie einen Code, der zeigt, wie Sie die Datei lesen und schreiben? – Malcor

+0

Noch nicht. Ich muss die Wagenrückgabe loswerden, bevor ich etwas tun kann. Schreiben in die Datei ist trivial. Ich brauche nur die Wagenrückgabe, und ich schreibe später in die Datei. Die Aufgaben werden getrennt sein. – pminogue

+0

Globale Idee wäre Datei als Lesen/Schreiben zu öffnen, setzen Sie den Zeiger auf die letzten zwei Zeichen (CR + LF ist zwei Zeichen) und beginnen Sie von dort zu schreiben. Das würde die letzte neue Zeile entfernen ... –

Antwort

3
Dim crString = Environment.NewLine '= vbCrLf 
    Dim crBytes = Encoding.UTF8.GetBytes(crString) 
    Dim bytesRead(crBytes.Length - 1) as Byte 
    Dim iOffset As Integer = 0 
    Dim stringRead As String 

    Using fs = File.Open("G:\test.txt", FileMode.Open, FileAccess.ReadWrite)  
     While iOffset < fs.Length  
      fs.Seek(- (crBytes.Length + iOffset), SeekOrigin.End) 
      fs.Read(bytesRead,0, crBytes.Length) 
      stringRead = Encoding.UTF8.GetString(bytesRead) 
      If stringRead = crString Then 
       fs.SetLength(fs.Length - (crBytes.Length * iOffset + 1)) 
       Exit While 
      End If 
      iOffset += 1 
     End While 
    End Using 

Ich öffne die Textdatei als FileStream und legen Sie seine Position bis zum Ende der Datei - Länge des Wagenrücklauf-String.

Ich habe dann die aktuellen Bytes gelesen, während ich den Offset verringert habe, bis ich einen Wagenrücklauf gefunden habe oder der eof erreicht wurde.

Wenn eine CR gefunden wurde, entferne ich sie und alles, was danach kommt. Wenn Sie das nicht möchten, entfernen Sie einfach die Schleife und überprüfen Sie nur die eof. Aber es könnte einige vbNullString am eof geben, deshalb verwende ich die Schleife.

Bitte beachten Sie, dass ich UTF8 Codierung in meinem Beispiel verwendet habe. Wenn Sie andere Kodierungen haben, müssen Sie sie entsprechend anpassen.

test.txt vor Lauf:

Before

test.txt nach Code-Snippet aus:

enter image description here

EDIT: fs.SetLength Teil war bei letzte Zeichen falsch in Datei war keine CR.

+0

Fabulous Zeug. Vielen Dank. Genau das habe ich gebraucht. – pminogue

+0

Bitte prüfen Sie, ob es mit * fehlerhaften * oder * irregulären * Textdateien funktioniert (wenn diese in Ihrer Umgebung auftreten). Ich habe es nur rudimentär getestet. Siehe auch meine Bearbeitung. –

+1

Es funktioniert perfekt mit den Dateien, die ich benutze, die immer von der gleichen Form sein sollten. Wenn dies nicht der Fall ist, wird dies erledigt, bevor dieses Skript sie berührt. Danke noch einmal. – pminogue

0

Ich habe gefunden String.Replace(ControlChars.CrLf.ToCharArray(),"") funktioniert.

Wahrscheinlich bessere Möglichkeiten, es auch zu tun!

+0

Es ist eigentlich eine Datei und keine Zeichenfolge. Danke für den Vorschlag. – pminogue