Почему Powershell Import-Csv не работает должным образом с этим CSV-файлом?

Я импортирую этот файл 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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
6 531
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не знаю причины точный, но похоже, что фунт/хэш заставляет 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"

ах... вы, вероятно, правы насчет информационной строки. это имело бы смысл. Я так привык пытаться удалить это, что забыл об этом.

Matt 19.06.2019 22:24

@LotPings Я сообщил о связанной проблеме, используя этот вопрос для примеров.

Bacon Bits 20.06.2019 00:38

Условная замена # может быть проще с одним регулярным выражением, содержащим негативный взгляд вперед и обратную ссылку необязательного ведущего ". => $data[0] = $data[0] -replace '^("?)#(?!TYPE)','$1Num#'

user6811411 20.06.2019 01:07

Да, это был #, я смог удалить его из вывода в файл CSV, и тогда программа работала нормально. Спасибо за помощь!

Todd Welch 20.06.2019 23:25

Для тех, кто ищет исправление, это сработало для меня:

((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

Другие вопросы по теме