Saltar al contenido

Eliminar la última línea del archivo con Powershell

Solución:

Si ya sabe que lo último del archivo es un CRLF del que desea deshacerse (y también conoce la codificación), puede seguir la ruta rápida:

$stream = [IO.File]::OpenWrite('foo.txt')
$stream.SetLength($stream.Length - 2)
$stream.Close()
$stream.Dispose()

Se trata de un truncamiento in situ del archivo. Funciona sin leer todo el archivo en la memoria (muy bueno si tiene un muy archivo grande). Funciona para ASCII, Latin- * y UTF-8. No funcionará de esa manera para UTF-16 (en ese caso, tendría que eliminar cuatro bytes del final).

Puede incluir una verificación adicional de que los dos últimos bytes son De Verdad lo que quieres eliminar:

$stream = [IO.File]::Open('foo.txt', [IO.FileMode]::Open)
$stream.Position = $stream.Length - 2
$bytes = 0..1 | %{ $stream.ReadByte() }
$compareBytes = 13,10 # CR,LF
if ("$bytes" -eq "$compareBytes") {
    $stream.SetLength($stream.Length - 2)
}
$stream.Close()
$stream.Dispose()

Nuevamente, adapte si usa otra codificación, por ejemplo, para UTF-16 necesita comparar con cualquiera 0,10,0,13 o 10,0,13,0.

De acuerdo, esto no es muy PowerShell-ey, pero desde que tuve que procesar un volcado de base de datos de 700 MiB, desconfío de leer archivos potencialmente grandes en la memoria por completo;)

Cuando lees un archivo usando Get-Content fluye cada línea por la tubería como una cuerda. Cuando Out-File (esencialmente lo que > es un alias para) obtiene estas cadenas, siempre agrega una secuencia de terminador de línea. Intente lo siguiente si los archivos no son demasiado grandes:

$text = [IO.File]::ReadAllText("c:FileWithEmptyLinesAtEnd.txt")
[IO.File]::WriteAllText("c:FileWithEmptyLinesAtEnd.txt", $text.TrimEnd())

Este es el archivo antes:

14> fhex .FileWithEmptyLinesAtEnd.txt

Address:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F ASCII
-------- ----------------------------------------------- ----------------
00000000 73 65 72 76 65 72 31 2C 73 65 72 76 65 72 32 2E server1,server2.
00000010 64 6F 6D 61 69 6E 2E 6C 6F 63 61 6C 2C 73 65 72 domain.local,ser
00000020 76 65 72 33 0D 0A 20 20 20 20 20 20             ver3..

y después:

19> fhex .FileWithEmptyLinesAtEnd.txt

Address:  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F ASCII
-------- ----------------------------------------------- ----------------
00000000 73 65 72 76 65 72 31 2C 73 65 72 76 65 72 32 2E server1,server2.
00000010 64 6F 6D 61 69 6E 2E 6C 6F 63 61 6C 2C 73 65 72 domain.local,ser
00000020 76 65 72 33                                     ver3

No estoy seguro de cuán aplicable es esto a la situación, pero mi búsqueda en Google para eliminar la última línea de un archivo de texto me llevó aquí y los ejemplos / soluciones anteriores no funcionaron. Este es el comando que pude usar para que esto funcione:

$file = "file.txt"
Get-Content $file | Measure-Object -Line
$a = (Get-Content $file | Measure-Object)
(Get-Content $file) | ? {($a.count-1)-notcontains $_.ReadCount} | Set-Content $file

Si está trabajando con un archivo grande, es posible que desee canalizarlo primero a un archivo temporal.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *