我无法理解何时使用Get-Content以及何时使用Import-Csv修改CSV文件。这是我的文件示例,它是哈希表的输出:
Name Key Value
AOI1\\ABC1 AOI1\\ABC1 TRUE
AOI2\\DEF2 AOI2\\DEF2 TRUE
\#AOI3\#\\GHI3 \#AOI3\#\\GHI3 FALSE
我需要对文件执行以下操作:
结果应如下所示:
Loc FName Result
AOI1 ABC1 TRUE
AOI2 DEF2 TRUE
#AOI3# GHI3 FALSE
要删除“ \\”以及“名称”列中的所有内容,我想到了以下脚本:
Import-Csv c:\test.csv |
% {$_.Name.split('\\\\')[0]}
这将输出以下内容:
AOI1
AOI2
但是,我希望能够将所有内容写回到同一Csv文件,因此我尝试将其更改为:
Get-Content c:\test.csv |
% {$_.Name.split('\\\\')[0]}
但是,我最终遇到了“您不能在空值表达式上调用方法”的错误消息。如果我保留Import-Csv并将脚本修改为也执行第4项,则会收到相同的错误消息。这是该脚本:
Import-Csv U:\To_Delete\Layer_search\results_STACK_layers.csv |
Select-Object @{n='AOI';e={$_.'Name'}}, @{n='LAYER';e={$_.'Key'}}, @{n='IN MAP';e={$_.'Value'}} |
% {$_.Name.split('\\\\')[0]}
那么,如何修改CSV并随后将其输出为相同的CSV?是什么原因导致该错误消息?
很抱歉,这篇冗长的文章,但我想提供足够的示例。
谢谢!
答案 0 :(得分:2)
假定您不能使用Bill_Stewart的建议来修复源,这是进行转换的一种方法。问题的[ grin ]部分是您使用字符串拆分方法而不是字符串拆分 operator 。第一个将每个字符当作分割目标。第二个使用正则表达式在分割字符串上分割,而不是在分割字符串中的字符上分割。
# fake reading in a CSV file
# in real life, use Import-CSV
$InStuff = @'
Name, Key, Value
AOI1\\ABC1, AOI1\\ABC1, TRUE
AOI2\\DEF2, AOI2\\DEF2, TRUE
\#AOI3\#\\GHI3, \#AOI3\#\\GHI3, FALSE
'@ | ConvertFrom-Csv
$Results = foreach ($IS_Item in $InStuff)
{
[PSCustomObject]@{
# new version removes the unwanted "\" from the ends of the "Loc" value
#Loc = ($IS_Item.Name -split [regex]::Escape('\\'))[0]
Loc = ($IS_Item.Name -split [regex]::Escape('\\'))[0].Replace('\')
FName = ($IS_Item.Key -split [regex]::Escape('\\'))[1]
Result = [convert]::ToBoolean($IS_Item.Value)
}
}
# on screen
$Results
# send to a CSV file
$Results |
Export-Csv -LiteralPath "$env:TEMP\Heather_RearrangedCSV.csv" -NoTypeInformation
在屏幕上...
Loc FName Result
--- ----- ------
AOI1 ABC1 True
AOI2 DEF2 True
#AOI3# GHI3 False
CSV文件内容...
"Loc","FName","Result"
"AOI1","ABC1","True"
"AOI2","DEF2","True"
"#AOI3#","GHI3","False"