我需要合并计算机上某个文件夹中的所有txt文件。它们有数百个,它们都有一个不同的名称,因此,为了合并文件而必须手动输入文件名的任何代码都不适用于我。文件采用"UTF-8"-encoding格式,包含不同语言的表情符号和字符(如Cyrillic脚本)以及带有重音的字符等(例如,ü,à.)。另一个堆栈溢出用户给了我下面的代码,以便在Powershell中运行:
(gc *.txt) | out-file newfile.txt -encoding utf8
它非常适合合并文件。但是,它实际上给了我一个txt文件,其中包含"UTF-8和BOM"-encoding,而不是"UTF-8"-encoding。此外,所有表情符号和特殊字符都已被移除,并被替换为其他字符,例如“圣保罗”而不是"ü“。对于我正在做的事情来说,这些表情符号和特殊角色的保留是非常重要的。
有人能帮我调整一下这段代码(或者建议另一段代码),这样它就给了我一个与"UTF-8"-encoding合并的txt文件,其中仍然包含了所有的特殊字符?请记住,我是个外行。
非常感谢您的帮助和亲切的问候!
发布于 2019-11-13 13:00:41
如果没有utf8参数,PS 5 (gc)无法处理任何bom输入文件:
(gc -Encoding Utf8 *.txt) | out-file newfile.txt -encoding utf8
发布于 2019-11-08 14:42:03
在PowerShell < 6.0中,Out-File
cmdlet没有Utf8NoBOM
编码。
但是,您可以使用Utf8编写不需要BOM的.NET文本文件:
以下所有方法都是通用的
$rootFolder = 'D:\test' # the path where the textfiles to merge can be found
$outFile = Join-Path -Path $rootFolder -ChildPath 'newfile.txt'
方法1
# create a Utf8NoBOM encoding object
$utf8NoBom = New-Object System.Text.UTF8Encoding $false # $false means NoBOM
Get-Content -Path "$rootFolder\*.txt" -Encoding UTF8 -Raw | ForEach-Object {
[System.IO.File]::AppendAllText($outFile, $_, $utf8NoBom)
}
方法2
# create a Utf8NoBOM encoding object
$utf8NoBom = New-Object System.Text.UTF8Encoding $false # $false means NoBOM
Get-ChildItem -Path $rootFolder -Filter '*.txt' -File | ForEach-Object {
[System.IO.File]::AppendAllLines($outFile, [string[]]($_ | Get-Content -Encoding UTF8), $utf8NoBom)
}
方法3
# Create a StreamWriter object which by default writes Utf8 without a BOM.
$sw = New-Object System.IO.StreamWriter $outFile, $true # $true is for Append
Get-ChildItem -Path $rootFolder -Filter '*.txt' -File | ForEach-Object {
Get-Content -Path $_.FullName -Encoding UTF8 | ForEach-Object {
$sw.WriteLine($_)
}
}
$sw.Dispose()
https://stackoverflow.com/questions/58764007
复制相似问题