Export-Csv发出长度而不是值

时间:2016-08-24 02:12:07

标签: powershell

我想读取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 nameExport to CSV only returning string length。但这些似乎并不能解决生成带有标题和一个字段值的实际CSV文件的问题。

PS C:\src\powershell> get-content .\x.csv
"Length"
"1"
"2"
"3"

1 个答案:

答案 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 /回车)。