这是一个三部分问题,都是相关的。上下文是这样的:我需要在任意文件中查找和替换,这些文件可能具有不同的编码,并且可能非常大(超过500 MB)。我当前的代码使用了Get-Content和Add-Content,它既是内存耗费又是大文件的非常高性能。
我有使用
成功识别源文件编码的代码$reader = [IO.StreamReader]::New($sourceFile, $true)
$reader.Peek() > $null
$encoding = $reader.CurrentEncoding
结果的格式为 System.Text.UTF8Encoding
1:我相信这种形式的构造函数是我对StreamWriter
所需要的$writer = [IO.StreamWriter]::New($tempFile, Encoding.UTF8)
我希望有一种内置的编程方式从字符串 System.Text.UTF8Encoding 获取构造函数所需的正确形式。或者我需要创建自己的哈希表或查找/替换来处理这个?
2:我在测试中使用过Encoding.UTF16,但结果文件仍然是UTF8。我最近接受过StreamReader的微妙教育,没有填充.CurrentEncoding
直到某种类型的Read发生(因此上面的代码中的.Peek()
),我想知道StreamWriter是否存在类似的问题?
3:我的理解是一些编码需要写入文件的结尾,但有些编码不需要。例如,在编写UTF8文件时,文件大小不匹配,直到$writer.WriteLine("
r n")
被包含为最后一个WriteLine。任何人都可以指出一个参考,说明哪些编码需要什么结局?
谢谢!
更新:
我找到了this thread,这让我开始了。并且,当$reader.CurrentEncoding
System.Text.UTF8Encoding 时,$encoding = New-Object $reader.CurrentEncoding $False
有效,但当$reader.CurrentEncoding
System.Text.UTF32Encoding 时得到关于
无法找到“UTF32Encoding”的重载
这看起来很奇怪,因为这不能是拼写错误或其他什么,我从文件中以编程方式获取字符串。
我认为,This表明所有这些都应该有用。但只有第一个有效。所有其余的都会抛出Overload错误。
$encoding = New-Object System.Text.UTF8Encoding $False
$encoding = New-Object System.Text.UTF32Encoding $False
$encoding = New-Object System.Text.ASCIIEncoding $False
$encoding = New-Object System.Text.UNICODEEncoding $False
PROGRESS 因此,似乎那些New-Objects中的$ false用于-strict参数,该参数仅适用于-comObject。并且只有System.Text.UTF8Encoding用作COM对象。所有这些都使用-typeName参数,该参数没有-strict参数。所以......
$encoding = New-Object -typeName:System.Text.UTF8Encoding
$encoding = New-Object -typeName:System.Text.UTF32Encoding
$encoding = New-Object -typeName:System.Text.ASCIIEncoding
$encoding = New-Object -typeName:System.Text.UNICODEEncoding
的工作原理。另外,我将StreamWriter构造函数更改为此
$writer = [IO.StreamWriter]::New($destinationFile, $true, (New-Object $reader.CurrentEncoding))
该布尔值保持流打开。 而且......此时我觉得我有一个有效的功能!
答案 0 :(得分:0)
所以,将所有内容压缩成更简洁的答案......
$reader = [IO.StreamReader]::New($sourceFile, $true)
$reader.Peek() > $null
$writer = [IO.StreamWriter]::New($destinationFile, $true, (New-Object -typeName:$reader.CurrentEncoding))
这是一种享受。
哪些编码需要特殊文件处理结束的问题仍然存在。