Я импортирую этот файл 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
Любая помощь будет принята с благодарностью.
Я не знаю причины точный, но похоже, что фунт/хэш заставляет 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}
, если их больше или не гарантируется, что первая строка пуста.
Обновлено: об этой проблеме сообщалось репозиторий 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"
@LotPings Я сообщил о связанной проблеме, используя этот вопрос для примеров.
Условная замена #
может быть проще с одним регулярным выражением, содержащим негативный взгляд вперед и обратную ссылку необязательного ведущего "
. => $data[0] = $data[0] -replace '^("?)#(?!TYPE)','$1Num#'
Да, это был #, я смог удалить его из вывода в файл CSV, и тогда программа работала нормально. Спасибо за помощь!
Для тех, кто ищет исправление, это сработало для меня:
((Import-CSV .\VMM_GlobalSetting.csv).Where{$_.PropertyName -eq 'QFEDatabaseVersion'}).PropertyValue
Я получал эту ошибку перед применением выше:
Select-Object : Property "QFEDatabaseVersion" cannot be found.
At C:\Users\blakedrumm\Desktop\VMMDataCollector\DataCollector\Functions\General-Info.ps1:789 char:81
+ ... ing.csv") | Select-Object QFEDatabaseVersion -ExpandProperty QFEDatab ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (@{PropertyName=...opertyValue=20}:PSObject) [Select-Object], PSArgumen
tException
+ FullyQualifiedErrorId : ExpandPropertyNotFound,Microsoft.PowerShell.Commands.SelectObjectCommand
ах... вы, вероятно, правы насчет информационной строки. это имело бы смысл. Я так привык пытаться удалить это, что забыл об этом.