需要帮助理解Powershell中Get Content和Import Csv之间的区别



我很难理解何时使用Get-Content以及何时使用Import-Csv修改Csv文件。下面是我的文件的一个例子,它是哈希表的输出:

Name            Key           Value  
AOI1\ABC1      AOI1\ABC1     TRUE 
AOI2\DEF2      AOI2\DEF2     TRUE
#AOI3#\GHI3  #AOI3#\GHI3 FALSE    

我需要对文件执行以下操作:

  1. 在"名称"列中删除"\\"及其后的所有内容
  2. 删除键列中的"\\"及其之前的所有内容
  3. 将最后一行的"\#"替换为"#">
  4. 重命名列标题

结果应该是这样的:

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_DeleteLayer_searchresults_STACK_layers.csv |
Select-Object @{n='AOI';e={$_.'Name'}}, @{n='LAYER';e={$_.'Key'}}, @{n='IN MAP';e={$_.'Value'}} |
% {$_.Name.split('\\')[0]}

那么,我如何修改我的CSV并在之后将其输出到相同的CSV?是什么原因导致了该错误消息?

很抱歉这篇文章太冗长了,但我想提供足够多的例子。

谢谢!

假设您不能使用Bill_Stewart关于修复源代码的建议,这里有一种方法可以进行转换。[grin]问题的一部分是您使用了字符串拆分方法而不是字符串拆分运算符。第一个将每个字符视为分割目标。第二个使用regex对拆分字符串进行拆分,而不是对拆分字符串中的字符进行拆分。

# 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:TEMPHeather_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"

最新更新