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 $row
的 property $col
。
MS Docs 的简短摘录:
当你想在另一个表达式中使用一个表达式时使用这个。例如,将命令的结果嵌入到字符串表达式中。
为了给你一个简短的解释为什么需要这样做,以这个为例:
$object = [pscustomobject]@
foo = 'var'
$property = 'foo'
当我们执行 "$object.$property"
或简单来说,"$object.foo"
时,双引号 "..."
不允许 PowerShell从 $object
引用 foo
属性,因为 dot .
被解释为文字而不是点方法。此外,引号将$object
转换为其字符串化的? 表示@foo=var
,后跟文字点.
,后跟$property
的变量扩展。
about_Properties的另一个摘录:
获取对象属性值的最常用方法是使用点方法。键入对对象的引用,例如包含对象的变量或获取对象的命令。然后,键入一个点 (.),后跟属性名称。
最后,除了$(...)
,我们还有什么其他方法可以解决这个问题:
String Formatting
和 String.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 文件中仅读取一列