Import-Csv TrimEnd列标题

时间:2015-06-25 19:43:41

标签: csv powershell

我需要导入CSV并通过foreach循环运行它。我想修剪列标题DeviceName的末尾以避免任何潜在的问题。我尝试了以下但是没有按预期工作。

$Import = Import-CSV $csv

foreach ($i in ($import.DeviceName).TrimEnd())
{do something}

有任何帮助吗?谢谢!

3 个答案:

答案 0 :(得分:1)

最好的解决方案是告诉其他团队修复他们的生成过程。但是,如果由于某种原因不能选择,我建议您在将文件导入为CSV之前对其进行预处理。

$filename = 'C:\path\to\your.csv'

(Get-Content $filename -Raw) -replace '^(.*DeviceName)[ ]*(.*)', '$1$2' |
  Set-Content $filename

将文件作为单个字符串(-Raw)读取,并将表达式锚定在字符串的开头(^),确保只替换列标题。

对于大型输入文件,您可能需要考虑不同的方法,因为上面会在替换第一行之前将整个文件读入内存。

$infile  = 'C:\path\to\input.csv'
$outfile = 'C:\path\to\output.csv'

$firstLine = $true
Get-Content $infile | % {
  if ($firstLine) {
    $_ -replace '(DeviceName)[ ]*', '$1'
    $firstLine = $false
  } else {
    $_
  }
} | Set-Content $outfile

再考虑一下,从评论到@Zeek的答案中获取灵感,您还可以先提取标题然后转换文件的其余部分。

$infile  = 'C:\path\to\input.csv'
$outfile = 'C:\path\to\output.csv'

$header = (Get-Content $infile -First 1) -split '\s*,\s*'

Get-Content $infile |
  select -Skip 1 |
  ConvertFrom-Csv -Header $header |
  Export-Csv $outfile -NoType

答案 1 :(得分:1)

如果您需要更改包含空格的devicename列中的标题和内容,我已经提出了这个宽容代码。

$csvData = import-csv $csv

$properties = $csvData[0].psobject.Properties.name
$csvHeader = "`"$(($properties | ForEach-Object{$_.Trim()}) -join '","')`""
$deviceHeader = $properties -match "DeviceName"

$csvHeader
$csvHeader | Set-Content $file
$csvData | ForEach-Object{
    $_.$deviceHeader = ($_.$deviceHeader).trim()
    $_
} | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Add-Content $file

这样做在CSV中正常读取。按照它们出现的顺序解析对象的属性名称。无论有多少空格,我们都会找到DeviceName的空格(如果有更多的空格可以存在问题)。保持这一点,以便我们可以使用它来调用每个“行”的正确属性。

将新清理的标题导出到文件中。然后我们遍历每个“行”,从DeviceName中删除所有前导和尾随空格。完成后,将CSV写回原始文件。

答案 2 :(得分:0)

这就是你想要的吗?这将为您提供从csv文件导入的对象集合,但会修剪每个对象上的DeviceName属性的末尾。

$items = Import-CSV -Path $csv
$items.ForEach({ $_.DeviceName = $_.DeviceName.TrimEnd() })