ConvertTo-Csv Output without quotes

前端 未结 14 964
慢半拍i
慢半拍i 2020-12-01 08:03

I am using ConvertTo-Csv to get comma separated output

 get-process | convertto-csv -NoTypeInformation -Delimiter \",\"

It out

相关标签:
14条回答
  • 2020-12-01 08:45

    Here is a way to remove the quotes

    get-process | convertto-csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''} 
    

    But it has a serious drawback if one of the item contains a " it will be removed !

    0 讨论(0)
  • 2020-12-01 08:46

    A slightly modified variant of JPBlanc's answer:

    I had an existing csv file which looked like this:

    001,002,003
    004,005,006
    

    I wanted to export only the first and third column to a new csv file. And for sure I didn't want any quotes ;-) It can be done like this:

    Import-Csv -Path .\source.csv -Delimiter ',' -Header A,B,C | select A,C | ConvertTo-Csv -NoTypeInformation -Delimiter ',' | % {$_ -replace '"',''} | Out-File -Encoding utf8 .\target.csv
    
    0 讨论(0)
  • 2020-12-01 08:52

    Once the file is generated, you can run

    set-content FILENAME.csv ((get-content FILENAME.csv) -replace '"')
    
    0 讨论(0)
  • 2020-12-01 08:53

    Depending on how pathological (or "full-featured") your CSV data is, one of the posted solutions will already work.

    The solution posted by Kory Gill is almost perfect - the only issue remaining is that quotes are removed also for cells containing the line separator \r\n, which is causing issues in many tools.

    The solution is adding a newline to the character class expression:

    $fixedData = $quotedData | % {$_ -replace  `
    '\G(?<start>^|,)(("(?<output>[^,"\n]*?)"(?=,|$))|(?<output>".*?(?<!")("")*?"(?=,|$)))' `
    ,'${start}${output}'}
    
    0 讨论(0)
  • 2020-12-01 08:54

    This function takes a powershell csv object from the pipeline and outputs like convertto-csv but without adding quotes (unless needed).

    function convertto-unquotedcsv {
        param([Parameter(ValueFromPipeline=$true)]$csv, $delimiter=',', [switch]$noheader=$false)
        begin {
          $NeedQuotesRex = "($([regex]::escape($delimiter))|[\n\r\t])"
          if ($noheader) { $names = @($true) } else { $names = @($false) }
        } 
        process {
          $psop = $_.psobject.properties
          if (-not $names) {
            $names = $psop.name | % {if ($_ -match $NeedQuotesRex) {'"' + $_ + '"'} else {$_}}
            $names -join $delimiter   # unquoted csv header
          }
          $values = $psop.value | % {if ($_ -match $NeedQuotesRex) {'"' + $_ + '"'} else {$_}}
          $values -join $delimiter    # unquoted csv line
        } 
        end {
        }
    }
    

    $names gets an array of noteproperty names and $values gets an array of notepropery values. It took that special step to output the header. The process block gets the csv object one piece at a time.

    Here is a test run

    $delimiter = ','; $csvData = @"
    id,string,notes,"points per 1,000",number
    4,"a delimiter$delimiter is in here,","test data 3",1,348
    5,"a comma, is in here,","test data 4`r`nwith a newline",0.5,347
    6,hello world2.,classic,"3,000",123
    "@
    
    $csvdata | convertfrom-csv | sort number | convertto-unquotedcsv -delimiter $delimiter
    
    id,string,notes,"points per 1,000",number
    6,hello world2.,classic,"3,000",123
    5,"a comma, is in here,","test data 4
    with a newline",0.5,347
    4,"a delimiter, is in here,",test data 3,1,348
    
    0 讨论(0)
  • 2020-12-01 08:57

    I haven't spent much time looking for removing the quotes. But, here is a workaround.

    get-process | Export-Csv -NoTypeInformation -Verbose -Path $env:temp\test.csv
    $csv = Import-Csv -Path $env:temp\test.csv
    

    This is a quick workaround and there may be a better way to do this.

    0 讨论(0)
提交回复
热议问题