我想读取CSV文件并输出只有一(1)个字段的CSV文件。我试图创建一个简洁的例子。
PS C:\src\powershell> Get-Content .\t.csv
field1,field2,field3
1,2,3
4,55,6
7,888,9
PS C:\src\powershell> Import-Csv -Path .\t.csv | `
>> ForEach-Object {
>> $_.field2 `
>> } | `
>> Export-Csv -Path .\x.csv -NoTypeInformation
>>
问题是field2的长度被写入导出的CSV文件。我希望字段标题为" field2"和值是原始CSV文件中的值。另外,我只需要引用它们的引号;并非无处不在。
我已阅读Export-CSV exports length but not name和Export to CSV only returning string length。但这些似乎并不能解决生成带有标题和一个字段值的实际CSV文件的问题。
PS C:\src\powershell> get-content .\x.csv
"Length"
"1"
"2"
"3"
答案 0 :(得分:2)
CSV对象在每行中使用 note属性来存储其字段,因此我们需要过滤每个行对象,并使用Select-Object
只留下我们想要的字段cmdlet(别名:select
),它一次处理整个CSV对象:
Import-Csv 1.csv | select field2 | Export-Csv 2.csv -NoTypeInformation
请注意,如果以|
,{
,(
或,
结尾,则无需转义行尾。
可以指定多个字段:select field2, field3
。
删除不需要的双引号,一般多字段情况:
Import-Csv 1.csv |
select field2 |
%{
$_.PSObject.Properties | %{ $_.value = $_.value -replace '"', [char]1 }
$_
} |
ConvertTo-Csv -NoTypeInformation |
%{ $_ -replace '"(\S*?)"', '$1' -replace '\x01', '""' } |
Out-File 2.csv -Encoding ascii
简化的单场案例:
Import-Csv 1.csv |
select field2 |
%{
$_.field2 = $_.field2 -replace '"', [char]1
$_
} |
ConvertTo-Csv -NoTypeInformation |
%{ $_ -replace '"(\S*?)"', '$1' -replace '\x01', '""' } |
Out-File 2.csv -Encoding ascii
一个字段内嵌入引号的棘手案例是通过临时用控制字符代码01替换它们来解决的(只有少数可用于典型的非破坏文本文件:09 / tab,0A / line饲料,0D /回车)。