背景
我有一个用竖线分隔的 csv 文件,如下所示:
ColA|ColB|ColC|ColD|ColE|ColF|ColG|ColH|ColI|ColJ|ColK
00000000|000000507|0000000|STATUS|0000|000000|000|0000|00|0000|00000
00000000|000000500|0000000|STATUS|0000|000000|000|0000|00|0000|00000
00000000|000007077|0000000|STATUS|0000|000000|000|0000|00|0000|00000
我想将 ColB 放在具有特定状态的行上并将其放入 headless csv 文件中,如下所示:
000000507,0000000001,0,0
000000500,0000000001,0,0
000007077,0000000001,0,0
行末尾的值 0000000001,0,0
对于每个项目都是相同的。
脚本
脚本的精简/通用版本如下所示:
$infile = Import-Csv ".\incsv.txt" -Delimiter '|'
$outfile = ".\outcsv.txt"
Foreach($inline in $infile){
If($inline.Status -ne 'Some Status'){
$outline = $inline.'ColB' + ',0000000001,0,0'
Add-Content $outfile $outline -Encoding ASCII
}
}
问题
问题是创建的新文件大约是应有大小的两倍,我知道这与编码有关。不幸的是,我找不到有效的编码。我尝试过 -Encoding ASCII
、-Encoding Default
、-Encoding UTF8
,但它们都太大了。
这不是问题,但读取创建的文本文件的程序将无法正确读取它。
我能做的就是从记事本中的新文件中复制文本,将其另存为 ANSI,并且工作正常。不过 ANSI 不是 -Encoding
参数中的选项。
如何让 Powershell 输出正确的文件类型?有没有更好的方法来解决这个问题?
我找到了this Google Groups conversation和 this Social TechNet帖子,但没有一个真正适合我。
最佳答案
如果输出文件已存在并且采用 Unicode 格式,则附加到文件时将忽略参数 -Encoding ASCII
。将循环更改为:
$infile | % {
if ($_.Status -ne 'Some Status') {
$_.'ColB' + ',0000000001,0,0'
}
} | Set-Content $outfile -Encoding ASCII
关于Powershell 文件输出大小的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23023364/