ConvertTo-Csv Output without quotes

前端 未结 14 961
慢半拍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:35

    I found that Kory's answer didn't work for the case where the original string included more than one blank field in a row. I.e. "ABC",,"0" was fine but "ABC",,,"0" wasn't handled properly. It stopped replacing quotes after the ",,,". I fixed it by adding "|(?<output>)" near the end of the first parameter, like this:

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

    Here's another approach:

    Get-Process | ConvertTo-Csv -NoTypeInformation -Delimiter "," | 
        foreach { $_ -replace '^"|"$|"(?=,)|(?<=,)"','' }
    

    This replaces matches with the empty string, in each line. Breaking down the regex above:

    • | is like an OR, used to unite the following 4 sub-regexes
    • ^" matches quotes in the beginning of the line
    • "$ matches quotes in the end of the line
    • "(?=,) matches quotes that are immediately followed by a comma
    • (?<=,)" matches quotes that are immediately preceded by a comma
    0 讨论(0)
  • 2020-12-01 08:37

    Hmm, I have Powershell 7 preview 1 on my mac, and Export-Csv has a -UseQuotes option that you can set to Never. :)

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

    I was working on a table today and thought about this very question as I was previewing the CSV file in notepad and decided to see what others had come up with. It seems many have over-complicated the solution.
    Here's a real simple way to remove the quote marks from a CSV file generated by the Export-Csv cmdlet in PowerShell.

    Create a TEST.csv file with the following data.

    "ID","Name","State"
    "5","Stephanie","Arizona"
    "4","Melanie","Oregon"
    "2","Katie","Texas"
    "8","Steve","Idaho"
    "9","Dolly","Tennessee"

    Save As: TEST.csv

    Store file contents in a $Test variable
    $Test = Get-Content .\TEST.csv

    Load $Test variable to see results of the get-content cmdlet
    $Test

    Load $Test variable again and replace all ( "," ) with a comma, then trim start and end by removing each quote mark

    $Test.Replace('","',",").TrimStart('"').TrimEnd('"')
    

    Save/Replace TEST.csv file

    $Test.Replace('","',",").TrimStart('"').TrimEnd('"') | Out-File .\TEST.csv -Force -Confirm:$false
    

    Test new file Output with Import-Csv and Get-Content:

    Import-Csv .\TEST.csv
    Get-Content .\TEST.csv
    

    To Sum it all up, the work can be done with 2 lines of code

    $Test = Get-Content .\TEST.csv
    $Test.Replace('","',",").TrimStart('"').TrimEnd('"') | Out-File .\TEST.csv -Force -Confirm:$false
    
    0 讨论(0)
  • 2020-12-01 08:41

    Couldn't find an answer to a similar question so I'm posting what I've found here...

    For exporting as Pipe Delimited with No Quotes for string qualifiers, use the following:

    $objtable | convertto-csv -Delimiter "|" -notypeinformation | select -Skip $headers | % { $_ -replace '"\|"', "|"} | % { $_ -replace '""', '"'} | % { $_ -replace "^`"",''} | % { $_ -replace "`"$",''} | out-file "$OutputPath$filename" -fo -en ascii
    

    This was the only thing I could come up with that could handle quotes and commas within the text; especially things like a quote and comma next to each other at the beginning or ending of a text field.

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

    I ran into this issue, found this question, but was not satisfied with the answers because they all seem to suffer if the data you are using contains a delimiter, which should remain quoted. Getting rid of the unneeded double quotes is a good thing.

    The solution below appears to solve this issue for a general case, and for all variants that would cause issues.

    I found this answer elsewhere, Removing quotes from CSV created by PowerShell, and have used it to code up an example answer for the SO community.

    Attribution: Credit for the regex, goes 100% to Russ Loski.

    Code in a Function, Remove-DoubleQuotesFromCsv

    function Remove-DoubleQuotesFromCsv
    {
        param (
            [Parameter(Mandatory=$true)]
            [string]
            $InputFile,
    
            [string]
            $OutputFile
        )
    
        if (-not $OutputFile)
        {
            $OutputFile = $InputFile
        }
    
        $inputCsv = Import-Csv $InputFile
    
        $quotedData = $inputCsv | ConvertTo-Csv -NoTypeInformation
    
        $outputCsv = $quotedData | % {$_ -replace  `
            '\G(?<start>^|,)(("(?<output>[^,"]*?)"(?=,|$))|(?<output>".*?(?<!")("")*?"(?=,|$)))' `
            ,'${start}${output}'}
    
        $outputCsv | Out-File $OutputFile -Encoding utf8 -Force
    }
    

    Test Code

    $csvData = @"
    id,string,notes,number
    1,hello world.,classic,123
    2,"a comma, is in here","test data 1",345
    3,",a comma, is in here","test data 2",346
    4,"a comma, is in here,","test data 3",347
    5,"a comma, is in here,","test data 4`r`nwith a newline",347
    6,hello world2.,classic,123
    "@
    
    $data = $csvData | ConvertFrom-Csv
    "`r`n---- data ---"
    $data
    
    $quotedData = $data | ConvertTo-Csv -NoTypeInformation
    "`r`n---- quotedData ---"
    $quotedData
    
    # this regular expression comes from:
    # http://www.sqlmovers.com/removing-quotes-from-csv-created-by-powershell/
    $fixedData = $quotedData | % {$_ -replace  `
      '\G(?<start>^|,)(("(?<output>[^,"\n]*?)"(?=,|$))|(?<output>".*?(?<!")("")*?"(?=,|$)))' `
      ,'${start}${output}'}
    "`r`n---- fixedData ---"
    $fixedData
    
    $fixedData | Out-File e:\test.csv -Encoding ascii -Force
    "`r`n---- e:\test.csv ---"
    Get-Content e:\test.csv
    

    Test Output

    ---- data ---
    
    id string               notes                       number
    -- ------               -----                       ------
    1  hello world.         classic                     123   
    2  a comma, is in here  test data 1                 345   
    3  ,a comma, is in here test data 2                 346   
    4  a comma, is in here, test data 3                 347   
    5  a comma, is in here, test data 4...              347   
    6  hello world2.        classic                     123   
    
    ---- quotedData ---
    "id","string","notes","number"
    "1","hello world.","classic","123"
    "2","a comma, is in here","test data 1","345"
    "3",",a comma, is in here","test data 2","346"
    "4","a comma, is in here,","test data 3","347"
    "5","a comma, is in here,","test data 4
    with a newline","347"
    "6","hello world2.","classic","123"
    
    ---- fixedData ---
    id,string,notes,number
    1,hello world.,classic,123
    2,"a comma, is in here",test data 1,345
    3,",a comma, is in here",test data 2,346
    4,"a comma, is in here,",test data 3,347
    5,"a comma, is in here,","test data 4
    with a newline","347"
    6,hello world2.,classic,123
    
    ---- e:\test.csv ---
    id,string,notes,number
    1,hello world.,classic,123
    2,"a comma, is in here",test data 1,345
    3,",a comma, is in here",test data 2,346
    4,"a comma, is in here,",test data 3,347
    5,"a comma, is in here,","test data 4
    with a newline","347"
    6,hello world2.,classic,123
    
    0 讨论(0)
提交回复
热议问题