PowerShell从csv文件中读取列值[重复]

Posted

技术标签:

【中文标题】PowerShell从csv文件中读取列值[重复]【英文标题】:PowerShell read column value from csv file [duplicate] 【发布时间】:2022-01-05 05:51:09 【问题描述】:

这是我下面的 CSV 格式输入数据,角色、管理员、会计和安全是列。

roles, admin,accountant,security
Engineer,  ,x , ,

我想使用下面代码的列来获取行的值,例如 foreach for accountant 列应该返回“x”,但我得到了别的东西。

$path = "$PSScriptRoot\Test.csv"
$csv = Import-Csv -path $path -Delimiter ","
$columns = $csv | Get-member -MemberType 'NoteProperty' | Select-Object -ExpandProperty 'Name'

$csv | ForEach-Object 

$row = $_
foreach ($col in $columns) 

   Write-Host " vaalue of scripting is : $col " 
   Write-Host " vaalue of scripting row is : $row.$col " 
   Start-Sleep -s 10


我得到的输出是

 vaalue of scripting is : accountant 
 vaalue of scripting row is : @roles=Engineer; admin=; accountant=x ; security=.accountant 
 vaalue of scripting is : admin 
 vaalue of scripting row is : @roles=Engineer; admin=; accountant=x ; security=.admin
 vaalue of scripting is : roles 
 vaalue of scripting row is : @roles=Engineer; admin=; accountant=x ; security=.roles

如何使用会计列或任何其他列值获取“x”

【问题讨论】:

$( $row.$col ) 应该成功了。 我现在正在使用手机 :) 从此链接 docs.microsoft.com/en-us/powershell/module/… 查找 $( ) subexpression operator 以了解它为什么有效,如果您觉得可以回答您自己的问题。 @SantiagoSquarzon 不着急。当您恢复舒适时,请给出解决方案,以便我接受 简而言之:为了将 表达式 嵌入可扩展字符串 ("..."),您必须将它们括在 $(...) 中。值得注意的是,这包括属性和索引访问(例如,$($var.property)$($var[0]))。只有变量作为一个整体不需要这个(例如,$var$env:USERNAME)。请参阅 this answer 链接的副本。 【参考方案1】:

根据我的评论,简短的回答是使用 Subexpression operator $( ),这将允许 PowerShell 引用 object $rowproperty $col

MS Docs 的简短摘录:

当你想在另一个表达式中使用一个表达式时使用这个。例如,将命令的结果嵌入到字符串表达式中。


为了给你一个简短的解释为什么需要这样做,以这个为例:

$object = [pscustomobject]@
    foo = 'var'


$property = 'foo'

当我们执行 "$object.$property" 或简单来说,"$object.foo" 时,双引号 "..." 不允许 PowerShell从 $object 引用 foo 属性,因为 dot . 被解释为文字而不是点方法。此外,引号将$object 转换为其字符串化的? 表示@foo=var,后跟文字点.,后跟$property 的变量扩展。

about_Properties的另一个摘录:

获取对象属性值的最常用方法是使用点方法。键入对对象的引用,例如包含对象的变量或获取对象的命令。然后,键入一个点 (.),后跟属性名称。


最后,除了$(...),我们还有什么其他方法可以解决这个问题

String FormattingString.Format method:
'Value of $object.$property is "0".' -f $object.$property
[string]::Format('Value of $object.$property is "0".', $object.$property)
使用+ 连接字符串也是众所周知的一种:
'Value of $object.$property is "' + $object.$property + '".'

作为旁注,与实际问题无关,这可能是处理代码的更直接方式:

@'
roles,admin,accountant,security
Engineer,,x,,
Operator,,y,,
'@ |
ConvertFrom-Csv | ForEach-Object -Begin  $i = 1  -Process 
    foreach($Property in $_.PSObject.Properties.Name)
    
        
        'Value of Row 0 Column "1" is "2"' -f 
            $i, $Property, (
                'NULL', ($val = $_.$Property)
            )[[int][bool]$val]
    
    $i++

注意使用.PSObject 来访问对象的属性和方法,这是Get-Member 的替代方法。

以上将导致:

Value of Row 1 Column "roles" is "Engineer"
Value of Row 1 Column "admin" is "NULL"
Value of Row 1 Column "accountant" is "x"
Value of Row 1 Column "security" is "NULL"
Value of Row 2 Column "roles" is "Operator"
Value of Row 2 Column "admin" is "NULL"
Value of Row 2 Column "accountant" is "y"
Value of Row 2 Column "security" is "NULL"

【讨论】:

【参考方案2】:

我是根据您的 csv 文件编写的,如果它有效,请告诉我(更改文件夹路径和文件名)。

$folderspath = 'C:\Test'
$csvfilename = 'info.csv'
$csvfilepath = $folderspath + "\" + $csvfilename
$csvfilepath = $csvfilepath.ToString()

$csvfile = Import-CSV -Path $csvfilepath -Delimiter ","
    ForEach ($row in $csvfile) 
        IF($row.security -eq "High") 
            $Roles = $row.roles
            $Admin = $row."admin"
            $Accountant = $row.accountant
            $Security = $row."security"

            Write-Host "Roles: " $Roles "; Admin:" $Admin "; Accountant:" $Accountant "; ` 
            Security:" $Security
    


我使用的csv文件

roles, admin,accountant,security
Engineer,  ,x , ,
Engineer2,Yes ,x ,High,
Engineer3, No, , Low,

【讨论】:

以上是关于PowerShell从csv文件中读取列值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Powershell 从 csv 文件中仅读取一列

PowerShell - 从 csv 文件读取数据,比较特定列中的数据并将结果写入新文件

从csv读取后使用powershell向vm添加标签时出错

如何从熊猫中的前一行复制缺失的列值[重复]

从 csv 文件中读取数据需要很长时间 [重复]

从php中的csv文件读取大数据[重复]