似乎当我处理输入时,将其保存到临时文件,然后加载该临时文件以删除双引号 - 它可以工作。
是否可以在线执行此操作?如果代码未在下面注释,则会失败。
输入文件:
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
答案 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