在CSV中编辑列

时间:2018-12-18 20:34:40

标签: powershell csv replace formatting

我有一个包含24,000多个服务器名称以及其他信息的CSV。 CSV的列为NameGroupTarget。输入“名称”列的原始数据的示例是:

WindowsAuthServer @ wddg9028WIN

我正在尝试找到一种方法来编辑CSV中的Name列。我需要从服务器名称中删除WindowsAuthServer @WIN。我唯一想保留的是服务器名称,在本示例中为wddg9028。潜在的问题是,并非每个服务器名称都具有这种格式,并且某些服务器名称仅包含服务器名称。显然,已经正确的那些不需要更改,但是我不确定这是否会丢掉。

我尝试做:

$test = $file.Name -replace "WindowsAuthServer @ ",""

这将完全按照我的要求返回名称(减去WIN)。但是,每当执行此操作时,都会丢失CSV中的所有其他列。

是否可以编辑CSV中的一列?在这种情况下,是否应该在读取数据时完成?

2 个答案:

答案 0 :(得分:2)

对于大数据集,通常最好使用基于管道的命令,以保持内存使用恒定:

Import-Csv in.csv |
  Select-Object @{ 
      n='Name'
      e={ $_.Name -creplace 'WindowsAuthServer @ |WIN' }
    }, Group, Target |
      Export-Csv -NoTypeInformation -Encoding Utf8 out.csv

这样,数据将按行处理 ,此外,您可以将Select-Objectcalculated property配合使用来进行名称转换。


也就是说,如果性能很重要 并且您知道可以一次将所有数据放入内存 ,则可以使用以下命令( PSv4 +):

# Read the file in full into memory (transformed into objects).
$file = Import-Csv in.csv 

# Modify the `.Name` property values of the in-memory object collection.
$file.ForEach({ $_.Name = $_.Name -creplace 'WindowsAuthServer @ |WIN' })

# Export the in-memory object collection back to a CSV file.
$file | Export-Csv -NoTypeInformation -Encoding Utf8 out.csv

关于您尝试过的事情

  

$test = $file.Name -replace "WindowsAuthServer @ ",""

此语句对所有.Name属性值执行字符串替换,并将转换后的字符串作为新字符串返回(然后将其分配给$test)。

因此,您的$file.Name值保持不变

相反,您必须显式更新.Name属性。
尽管可能很想执行以下操作,但它有效:

# !! Does NOT work if $file is an *array* of objects.
$file.Name = $file.Name -replace "WindowsAuthServer @ ",""

也就是说,尽管您可以通过简单的属性访问(.Name获取对象数组的属性值-一种称为成员枚举的功能-不支持设置设计为 的属性-请参见this GitHub issue

除了使用上述管道之外,您还有两种选择:

  • 在PSv4 +中,您可以使用.Where()收集方法,如上所示。

  • (也适用于较低的PS版本),使用foreach循环,如Ansgar Wiechers' answer所示。

答案 1 :(得分:1)

导入CSV。处理循环中的行,将所修改字段的当前值替换为修改后的值。将数据导出回CSV。

$csv = Import-Csv 'C:\path\to\input.csv'

foreach ($row in $csv) {
    $row.Name = $row.Name -replace 'WindowsAuthServer @ '
}

$csv | Export-Csv 'C:\path\to\output.csv' -NoType

这至少是您关于该主题的第三个问题。请去查找PowerShell教程。这是真的基本内容。