【问题标题】:How to export data into a specific column in a csv file in PowerShell如何将数据导出到 PowerShell 中 csv 文件中的特定列
【发布时间】:2019-02-25 22:53:54
【问题描述】:

我要做的是从具有 UserPrincipalnames 的 csv 文件中导入数据,并且我在 @ 符号之前使用名称,然后我想将该数据导出到同一 CSV 文件中的特定列中案例是 o365Users.csv。我可以将其写入文本文件,但我需要知道如何将其导出到 G 列,标题名称为 SAM

这是我的代码:

$Addys = Import-Csv "C:\scripts\o365Users.csv"
$UPNs = $Addys.UserPrincipalName
    foreach ($UPN in $UPNs) {
    $Name = $UPN.Split("@")[0]
        Write-Output $Name >> c:\scripts\o365Names.txt
 }

【问题讨论】:

  • 如果你Import-CSV,你会得到一个对象数组,其中每个对象都有一个字段对应于工作表中的每一列。然后,您可以对数组中的值进行就地更改(例如,$foo[99].ColumnG = 'bar'),完成后,只需将Export-CSV 数组返回文件即可。
  • 如果您要添加列,那么您必须使用附加字段创建一个新对象数组,并且Export-CSV 新对象数组而不是旧的。
  • Import-Csv -Path $path | % { $_.Name = $_.UserPrincipalName.Split('@')[0]; $_ } | Export-Csv -Path $path -NoTypeInformation -Force

标签: powershell csv export-csv


【解决方案1】:

追加带有标题 SAM 的新列,请使用带有计算属性的 Select-Object

(Import-Csv 'C:\scripts\o365Users.csv') | 
    Select-Object -Property *,@{n='SAM';e={$_.UserPrincipalName.Split('@')[0]}}

如果新属性必须位于特定位置,则不能使用通配符*,但必须按所需顺序枚举所有标题/列/属性,即

(Import-Csv 'C:\scripts\o365Users.csv') | 
    Select-Object -Property ColA,ColB,ColC,ColD,ColE,ColF,@{n='SAM';e={$_.UserPrincipalName.Split('@')[0]}},ColH

用你的真实标题替换Col_

由于将(Import-Csv) 括在括号中,您可以导出到相同的文件名(在测试时不推荐)- 只需附加
| Export-Csv 'C:\scripts\o365Users.csv' -NoTypeInformation

【讨论】:

    【解决方案2】:

    这是一种快速获取所需输出的方法。您将导入当前的 CSV。创建一个空白输出数组并在循环中添加每个名称。然后导出 CSV

    $Addys = Import-Csv "C:\scripts\o365Users.csv"
    $UPNs = $Addys.UserPrincipalName
    
    [System.Collections.ArrayList]$Output = @()
    
    foreach ($UPN in $UPNs) {
        $Name = $UPN.Split("@")[0]
        $Output.Add($Name) | Out-Null
    }
    
    $Output | Export-Csv -Path "C:\scripts\o365Users.csv" -NoTypeInformation
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多