【问题标题】:Export-Csv emits Length and not valuesExport-Csv 发出 Length 而不是值
【发布时间】:2016-12-31 00:04:16
【问题描述】:

我想读取一个 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"

【问题讨论】:

    标签: powershell


    【解决方案1】:

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

    【讨论】:

    • 我相信您拥有它...对于一 (1) 个字段。需要一些周期才能将其转换为通用 CSV 使用的完整解决方案。确实应该是 Powershell 提供了控制引用的开关。有些人可能想要或需要引用的每个字段。我希望看到引号被省略,除非该字段包含引号字符或分隔符。
    【解决方案2】:

    根据 WOxxOm 的回复,Select-Object 是从输入中仅选择字段并通过管道输出的最佳方式。

    关于引号,这是 PowerShell 的一个已知(且令人沮丧)问题。指定 , 作为分隔符没有帮助。 我已经通过使用ConvertTo-CsvForeach-Object 替换来解决它。如果您的数据包含引号,则替换将需要更复杂。

    Import-Csv .\1.csv |
    Select-Object field2 |
    ConvertTo-Csv -NoTypeInformation |
    ForEach-Object {$_ -replace '"',''} |
    Out-File .\2.csv
    

    【讨论】:

    • 谢谢@gms0ulman。这确实有效,但正如您所提到的,引号删除在许多情况下都不起作用。
    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 2011-08-09
    • 2013-10-27
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多