我需要导入CSV并通过foreach
循环运行它。我想修剪列标题DeviceName
的末尾以避免任何潜在的问题。我尝试了以下但是没有按预期工作。
$Import = Import-CSV $csv
foreach ($i in ($import.DeviceName).TrimEnd())
{do something}
有任何帮助吗?谢谢!
答案 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() })