替换导入的CSV文件中的字符串

时间:2017-08-30 14:59:05

标签: powershell powershell-v4.0

我需要导入CSV文件,然后将完整的用户名domain\username替换为username

以下几行有效,但我只收到修改后的用户名作为输出而不是完整文件。

你能告诉我吗?

$TestFile = Import-Csv .\file.csv 
$NewFile = $TestFile | ForEach-Object {$_."Username" -replace 'domain\\',''}

3 个答案:

答案 0 :(得分:2)

使用ForEach-Object循环处理CSV输入时,需要将数据输出回管道。此外,-replace运算符不会就地修改变量或属性。它接受值,完成工作,并将修改后的字符串输出到成功输出流。如果要更新属性,则需要将修改后的值分配回该属性。

改变这个:

$TestFile = Import-Csv .\file.csv 
$NewFile = $TestFile | ForEach-Object {$_."Username" -replace 'domain\\',''}

进入这个:

$NewFile = Import-Csv .\file.csv | ForEach-Object {
    $_.Username = $_.Username -replace 'domain\\', ''      # update username
    $_                                    # feed data back into the pipeline
}

并且代码将执行您想要的操作。

答案 1 :(得分:1)

您可以对字符串数据执行替换,然后使用ConvertFrom-Csv将其转换为对象。

$TestFile = (Get-Content .\file.csv) -replace 'domain\\',''
$NewFile = ConvertFrom-Csv $TestFile

答案 2 :(得分:0)

这是一种方法 - 从输入表中获取列名,迭代表中的每一行,并输出需要更改的新自定义对象。

$table = Import-Csv "Test.csv"

# Get column names
$columnNames = ($table | Select-Object -First 1).PSObject.Properties |
  Select-Object -ExpandProperty Name

# Iterate each row in the table
foreach ( $row in $table ) {
  $outputObject = New-Object PSObject
  foreach ( $columnName in $columnNames ) {
    if ( $columnName -eq "Username" ) {
      $outputObject | Add-Member NoteProperty "Username" ($row.Username.Split('\')[1])
    }
    else {
      $outputObject | Add-Member NoteProperty $columnName $row.$columnName
    }
  }
  $outputObject
}

要创建新的CSV文件作为输出,请将上述代码放在脚本中并输入Export-Csv