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

时间:2019-01-08 19:12:05

标签: powershell

我无法理解何时使用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_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?是什么原因导致该错误消息?

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

谢谢!

1 个答案:

答案 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"