Powershell Удалить пробелы только в заголовке csv - PullRequest
0 голосов
/ 21 декабря 2018

Первая строка csv выглядит так же, как и пробелы после Path *

author    ,Revision  ,Date      ,SVNFolder ,Rev,Status,Path

Я пытаюсь удалить только пробелы, а остальное содержимое будет таким же.

author,Revision,Date,SVNFolder,Rev,Status,Path

Я пробовал ниже

Import-CSV .\script.csv | ForEach-Object {$_.Trimend()}

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

Примечание. Приведенные ниже решения позволяют избежать загрузки всего файла 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] экземпляры имеют такой метод).

Помимо этого, как уже говорилось, ваша цель состоит в том, чтобы обрезать имена свойств этих объектов, иэто невозможно сделать без создания новых объектов.

0 голосов
/ 21 декабря 2018

расширение комментария с примером, поскольку, похоже, вы новичок:

$text = get-content .\script.csv
$text[0] = $text[0] -replace " ", ""
$csv = $text | ConvertFrom-CSV
0 голосов
/ 21 декабря 2018
$inFilePath = "C:\temp\headerwithspaces.csv"
$content = Get-Content $inFilePath
$csvColumnNames = ($content | Select-Object -First 1) -Replace '\s',''
$csvColumnNames = $csvColumnNames -Replace '\s',''
$remainingFile = ($content | Select-Object -Skip 1) 
0 голосов
/ 21 декабря 2018

Считать весь файл в массив:

$a = Get-Content test.txt

Заменить пробелы в первом элементе массива ([0]) пустыми строками:

$a[0] = $a[0] -replace " ", ""

Записать поверх оригиналаfile: (Не забывайте резервные копии!)

$a | Set-Content test.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...