stu*_*net 12 csv powershell text
我在用
gc FileWithEmptyLines.txt | where {$_ -ne ""} > FileWithNoEmptyLines.txt
Run Code Online (Sandbox Code Playgroud)
删除SSRS放在CSV底部的空行.
但是,最后一行(包含数据)以CRLF结尾(如Notepad ++中所示) - 并未删除,因此从技术上讲,文件底部仍有一个空行.
有没有办法从最后一行删除这个CRLF(并保持数据完好无损)?
Joe*_*oey 13
如果你已经知道文件的最后一件事是CRLF你想要摆脱(你也知道编码)你可以走快速路线:
$stream = [IO.File]::OpenWrite('foo.txt')
$stream.SetLength($stream.Length - 2)
$stream.Close()
$stream.Dispose()
Run Code Online (Sandbox Code Playgroud)
这是文件的就地截断.它可以在不将所有文件读入内存的情况下工作(非常好,如果你有一个非常大的文件).它适用于ASCII,Latin-*和UTF-8.对于UTF-16,它将无法正常工作(在这种情况下,您必须从末尾删除四个字节).
您可以包含一个额外的检查,表明最后两个字节确实是您要删除的内容:
$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()
Run Code Online (Sandbox Code Playgroud)
再次,适应如果使用其他的编码,例如,对于UTF-16需要比较两种0,10,0,13或10,0,13,0.
同意,这不是PowerShell-ey,但是自从我必须处理700-MiB数据库转储以来,我一直担心将可能存在的大文件完全读入内存;)
当您使用Get-Content它读取文件时,将每一行作为字符串流入管道.当Out-File(基本上>是别名)得到这些字符串时,它总是附加行终止符序列.如果文件不是太大,请尝试以下操作:
$text = [IO.File]::ReadAllText("c:\FileWithEmptyLinesAtEnd.txt")
[IO.File]::WriteAllText("c:\FileWithEmptyLinesAtEnd.txt", $text.TrimEnd())
Run Code Online (Sandbox Code Playgroud)
这是之前的文件:
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..
Run Code Online (Sandbox Code Playgroud)
之后:
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
Run Code Online (Sandbox Code Playgroud)