Примечание. Приведенные ниже решения позволяют избежать загрузки всего файла CSV в память.
Сначала получите строку заголовка и исправьте ее, удалив из нее все пробелы:
$header = (Get-Content -TotalCount 1 .\script.csv) -replace '\s+'
Если выхочу переписать файл CSV, чтобы исправить проблему с заголовком:
# Write the corrected header and the remaining lines to the output file.
# Note: I'm outputting to a *new* file, to be safe.
# If the file fits into memory as a whole, you can enclose
# Get-Content ... | Select-Object ... in (...) and write back to the
# input file, but note that there's a small risk of data loss, if
# writing back gets interrupted.
& { $header; Get-Content .\script.csv | Select-Object -Skip 1 } |
Set-content -Encoding utf8 .\fixed.csv
Примечание: я выбрал -Encoding utf8
в качестве примера выходной кодировки символов;отрегулируйте по мере необходимости;обратите внимание, что по умолчанию используется ASCII (!), что может привести к потере данных.
Если вы просто хотите импортировать CSV с использованием фиксированных заголовков:
& { $header; Get-Content .\script.csv | Select-Object -Skip 1 } | ConvertFrom-Csv
Что касается того, что вы пытались :
Import-Csv
использует имена столбцов в заголовке в качестве имен свойств пользовательских объектов, которые он создает из входных строк.
Имена этого свойства заблокированы во время чтения файла и не могут быть изменены позже - если вы явно не создадите новые пользовательские объекты из старых с обрезанными именами свойств.
Import-Csv ... | ForEach-Object {$_.Trimend()}
Поскольку Import-Csv
выводит [pscustomobject]
экземпляров, отраженных один за другим в $_
в блоке ForEach-Object
, ваш код пытается вызвать .TrimEnd()
непосредственно на них, чтопотерпит неудачу (потому что только [string]
экземпляры имеют такой метод).
Помимо этого, как уже говорилось, ваша цель состоит в том, чтобы обрезать имена свойств этих объектов, иэто невозможно сделать без создания новых объектов.