Почему Powershell Import-Csv не работает должным образом с этим CSV-файлом? - PullRequest
2 голосов
/ 19 июня 2019

Я импортирую этот CSV-файл в powershell, но он импортирует не заголовки, а также не все столбцы. Он получает только первый столбец, но думает, что заголовков нет. Я понимаю, что вторая строка пуста, но именно так программное обеспечение генерирует файл CSV с данными, с которыми мне нужно работать.

CSV-файл:

#,Labels,Machine Name,System Description,IP,User Logged,Disk Free C
,,,,,,
6,"computers-PRO,Desktop,Office 2010,OS Windows 7,Update Adobe Reader",PRO-MEDASST,91-0-928,172.10.201.111,CHR\\jeniferc,6.3
7,Update Adobe Reader,RED,empty,172.10.201.5,,9.5
8,Update Adobe Reader,SIER,empty,172.10.201.5,,6.8

Код Powershell:

$computerscsv = import-csv -Path "C:\C Drives Less than 10GB free.csv" #import the csv file
$computerscsv | Format-Table
pause

Выход Powershell:

WARNING: One or more headers were not specified. Default names starting with "H" have been used in place of any missing
 headers.

H1
--
6
7
8

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

6 голосов
/ 19 июня 2019

Редактировать: Об этой проблеме сообщалось в репозитории PowerShell GitHub .


Кажется, это ошибка в команде.Заголовок в файле CSV не может начинаться с #.Обратите внимание, что преобразование первого заголовка в "#" вместо # также не устраняет проблему.

В качестве обходного пути:

$data = Get-Content "C:\C Drives Less than 10GB free.csv"
$data[0] = 'Num' + $data[0]
$data | ConvertFrom-Csv

Или для более общего решения:

$data = Get-Content "C:\C Drives Less than 10GB free.csv"
if ($data[0][0] -eq '#') {
    $data[0] = 'Num' + $data[0]
}
elseif ($data[0].Substring(0,2) -eq '"#') {
    $data[0] = '"Num' + $data[0].Substring(1)
}
$data | ConvertFrom-Csv

Я предполагаю, что Import-Csv и ConvertFrom-Csv ошибочно принимают первую строку, начинающуюся с #, как начало (теперь несколько устарело) информационной строки типа:

PS C:\> Get-ChildItem C:\Windows\ | Select-Object Name, LastWriteTime -First 1 | ConvertTo-Csv -NoTypeInformation:$false
#TYPE Selected.System.IO.DirectoryInfo
"Name","LastWriteTime"
"addins","9/15/2018 3:33:54 AM"
3 голосов
/ 19 июня 2019

Я не знаю точных аргументов , но похоже, что фунт / хеш Import-CSV игнорирует первую строку.По сути, ваш файл использует эти запятые в качестве заголовка, что также неверно.Вы можете смоделировать это, удалив первую строку в вашем файле.Вы получите тот же результат.Сам символ - не проблема, а факт, что это первый символ в заголовке.

Изменение этого персонажа достаточно, чтобы заставить его работать.

$file = Get-Content "C:\C Drives Less than 10GB free.csv"
$file[0] = $file[0].Replace('#',"Num")
$file | ConvertFrom-Csv 

Вам может не хватить "Num", но вам нужно сделать это что-то еще.Нужно посмотреть, есть ли лучший способ, но он должен это сделать.


При желании можно перенаправить на | Select-Object -Skip 1, чтобы обработать эту пустую строку, или, возможно, безопаснее было бы удалить записи без # через | Where-Object{$_.Num} в случае, если их больше или не гарантируется, чтоПервая строка пуста.

...