我有一个管道分隔的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放在具有特定状态的行上并将其放在像这样的无头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帖子,但实际上没有人为我工作。
答案 0 :(得分:2)
如果输出文件已存在并且是Unicode格式,则在附加到文件时将忽略参数-Encoding ASCII
。将你的循环改为:
$infile | % {
if ($_.Status -ne 'Some Status') {
$_.'ColB' + ',0000000001,0,0'
}
} | Set-Content $outfile -Encoding ASCII