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

Posted

技术标签:

【中文标题】如何使用 Powershell 从 csv 文件中仅读取一列【英文标题】:How to read only one column from csv file using Powershell 【发布时间】:2022-01-07 18:08:04 【问题描述】:

我正在处理 powershell 脚本,我正在尝试从我的 csv 文件中仅读取“用户”列,然后将其转换为他们的 Microsoft AzureAD 显示名称,但不确定如何执行此操作,因此如果我可以得到任何帮助或建议。

我的 csv 文件如下所示

C:\AuditLogSearch$($CurDate) Final Audit-Log-Records.csv

User       Date &Time       Activity
-------------------------------------
abc@gmail.com   11/22/2021     play soccer
kei@gmail.com   10/22/2021     play football
def@gmail.com   11/22/2021     play soccer
def@gmail.com   09/22/2021     play Baseball
xyz@gmail.com   08/22/2021     play soccer
klm@gmail.com   19/22/2021     play football
function Connect-AzureActiveDirectory 
    $pso = New-PSSessionOption -SkipCACheck:$true -SkipCNCheck:$true -SkipRevocationCheck:$true -OperationTimeout 180000 -ProxyAccessType AutoDetect
    Connect-AzureAD -Credential $credential -ConnectionUri https://outlook.office365.com/PowerShell-LiveID -PSSessionOption $pso
    $host.ui.RawUI.WindowTitle = "Exchange Online - NAM Production Beta MFA"
    Write-Host "Connected to Azure AD"      



function Convert-UserColumn 
    $ImportFile = "C:\AuditLogSearch\$($CurDate) Final Audit-Log-Records.csv"
    $ExportFile = "C:\AuditLogSearch\FinalFile.csv"

// I'm struggling with the logic here

    $list = @() foreach ($u in $ImportFile.User) 
        $list += Get-AzureDisplayName -mail $u
        
    

    Get-AzureADUser -ObjectId 

   | Export-Csv $ExportFile -NoTypeInformation

尝试使最终导出的 csv 文件看起来像这样 C:\AuditLogSearch\FinalFile.csv

User       Date &Time       Activity
-------------------------------------
Jonathan Sparkle   11/22/2021     play soccer

Randy Mod       10/22/2021     play football
Hanah P         11/22/2021     play soccer
Hanah P         09/22/2021     play Baseball
Cristiano Ronaldo   08/22/2021     play soccer
Leo Messi    19/22/2021     play football

【问题讨论】:

您好,我看到了您的评论,现在已删除。你能再解释一下这个问题吗?您确定没有重复的 UserPrincipalNames 吗? 哦,好吧,我想这是我的错误。我的导入文件有误,我认为它现在可以工作了。 @SantiagoSquarzon 能否请您再帮我一个,我正在尝试更改活动列值/文本。例如,如果 text = play football,则将其更改为“play futball”,text =“play football”,然后将其更改为“play rugby”等等.. 查看我的更新,如果它解决了您的问题,请考虑接受答案。 【参考方案1】:

您可以只更新导入的 CSV 的 User 属性上的值,无需创建 $list = @() 来保存结果。

假设 $ImportFile.User 包含有效的 UserPrincipalNames Azure AD 用户,您正在努力处理的部分将如下所示(绝对不需要函数):

$ImportFile = Import-Csv "C:\AuditLogSearch\$($CurDate) Final Audit-Log-Records.csv"
$ExportFile = "C:\AuditLogSearch\FinalFile.csv"

foreach ($u in $ImportFile) 
    $u.User = (Get-AzureADUser -ObjectId $u.User).DisplayName


$ImportFile | Export-Csv $ExportFile -NoTypeInformation

我正在尝试更改活动列值/文本。例如,如果 text = "play football" 则将其更改为 "play futball",或者如果 text = "play football" 则将其更改为 "play rugby" 等等。

这需要if 条件或switch。即:

# Using this as an Example
$csv = @'
User,Date & Time,Activity
abc@gmail.com,11/22/2021,play soccer
kei@gmail.com,10/22/2021,play football
def@gmail.com,11/22/2021,play soccer
def@gmail.com,09/22/2021,play Baseball
xyz@gmail.com,08/22/2021,play soccer
klm@gmail.com,19/22/2021,play football
'@ | ConvertFrom-Csv

foreach($line in $csv)

    $line.Activity = switch($line.Activity)
    
        'play soccer'  'play futball'; break 
        'play football'  'play rugby'; break 
        Default  $_  # If no matches, leave it as is
    


$csv | Format-Table
User          Date & Time Activity
----          ----------- --------
abc@gmail.com 11/22/2021  play futball
kei@gmail.com 10/22/2021  play rugby
def@gmail.com 11/22/2021  play futball
def@gmail.com 09/22/2021  play Baseball
xyz@gmail.com 08/22/2021  play futball
klm@gmail.com 19/22/2021  play rugby

【讨论】:

以上是关于如何使用 Powershell 从 csv 文件中仅读取一列的主要内容,如果未能解决你的问题,请参考以下文章

使用 Powershell 的备用拆分 CSV 列 [关闭]

PowerShell:如何计算 csv 文件中的行数?

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

Powershell 比较 CSV文件

如何在 csv/文本文件上一次计算多个字符串或一个字符串,并使用 powershell 返回包含列表数据中的字符串的值

如何使用 PowerShell 在 csv 文件中添加字符串并创建新列