是否可以在不使用临时文件的情况下添加列并删除双引号?

时间:2016-11-06 12:50:34

标签: powershell csv

似乎当我处理输入时,将其保存到临时文件,然后加载该临时文件以删除双引号 - 它可以工作。

是否可以在线执行此操作?如果代码未在下面注释,则会失败。

输入文件:

ICode,AccountNumber,Currency,TradeDateString,GrossAmount,BCode
CHK,953011,CAD,20160919,-20.17,N0

代码:

cls
$DebugPreference = 'Continue' 
cd "c:\_ps"

$InFile   = "trades_WithHeader.csv"
$OutFile  = "C:\_ps\trades_WithHeader_Manipulated2.csv"
$OutFile2 = "C:\_ps\trades_WithHeader_Manipulated4.csv"

$CSV = Import-Csv $InFile | select AccountNumber, @{Name="Name";Expression={$_.""}}

x=1;

foreach ($ReadData in $CSV) {$ReadData.Name=$x;$x++}

$CSV | Export-Csv $OutFile -NoTypeInformation 

# does not work - only "Length" column is output
#$CSV | ConvertTo-Csv -NoTypeInformation |
#    % {$_ -replace '"', ""} |
#    % {$_ -replace '"', ""} |
#    Export-Csv $OutFile2 -NoTypeInformation 

Import-Csv $OutFile | ConvertTo-Csv -NoTypeInformation |
    % {$_ -replace '"', ""} |
    Out-File $OutFile2 -Force -Encoding Ascii

Invoke-Item $OutFile2

2 个答案:

答案 0 :(得分:4)

使用Out-File(或等效的cmdlet,如Set-Content,默认情况下使用ASCII编码)是通过ConvertTo-Csv转换数据后将CSV数据写入文件的正确方法

Export-Csv cmdlet需要一个对象列表作为输入,并将对象的属性写为CSV的字段。如果您为ConvertTo-Csv生成的字符串列表提供它,则会将这些字符串对象(Length)的唯一属性写入输出文件。

要为数据添加索引列,您可以执行以下操作:

$x = 1
Import-Csv $InFile | ForEach-Object {
    New-Object -Type PSObject -Property @{
        AccountNumber = $_.AccountNumber
        Name          = $x
    }
    $x++
} | Export-Csv $OutFile -NoType

如果由于某些不明原因你必须删除双引号,请执行以下操作:

$x = 1
Import-Csv $InFile | ForEach-Object {
    New-Object -Type PSObject -Property @{
        AccountNumber = $_.AccountNumber
        Name          = $x
    }
    $x++
} | ConvertTo-Csv -NoType | ForEach-Object {
    $_ -replace '"', ''
} | Set-Content $OutFile

但请注意,我建议从CSV输出中删除双引号。它们是有效的CSV语法,如果您的字符串值包含分隔符或嵌套的双引号,则需要它们。

答案 1 :(得分:1)

试试这个

  $script:x=0
  import-csv $InFile | select AccountNumber , @{Name="Name";Expression={$script:x++; $script:x}} | export-csv -Path $InFile -NoTypeInformation 

如果你真的要删除引用

  $script:x=0
  import-csv $InFile | select AccountNumber , @{Name="Name";Expression={$script:x++; $script:x}} | ConvertTo-Csv -NoTypeInformation | % {$_.Replace('"','')} | Out-File $InFile