#powershell #csv
Вопрос:
Я пытаюсь прочитать CSV-файл с помощью powershell.
В настоящее время я делаю следующее:
#Reading CSV
$stats = Import-Csv -Path $counterFile -Delimiter $separator
И теперь мне нужно извлечь значения столбцов в разных объектах.
Я видел, что я должен иметь доступ к нему вот так:
$stats.ColumnHeader
Проблема в том, что этот столбец содержит даты, и один гений решил, что заголовком этого столбца будет часовой пояс компьютера в странном формате.
Итак, как я могу прочитать первый столбец, не «зная» текст заголовка и не изменяя заголовки других столбцов?
Есть ли способ получить доступ к этому столбцу через индексы?
Ответ №1:
У каждого PSCustomObject
из них есть несколько скрытых свойств:
$Stats |Get-Member -Force
Name MemberType Definition
---- ---------- ----------
pstypenames CodeProperty System.Collections.ObjectModel.Collection`1[[System.String, System.Private.CoreLib, Version=5.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]] pstypenames{get=PSTypeNames;}
psadapted MemberSet psadapted {ToString, GetType, Equals, GetHashCode}
psbase MemberSet psbase {ToString, GetType, Equals, GetHashCode}
psextended MemberSet psextended {Id, Name, Country, EMail, Age, ReportsTo}
psobject MemberSet psobject {BaseObject, Members, Properties, Methods, ImmediateBaseObject, TypeNames, get_BaseObject, get_Members, get_Properties, get_Methods, get_ImmediateBaseObject, get_TypeNames, ToString, Copy, CompareTo, Equals, GetHash…
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
... NoteProperty ...
Где PSObject
свойство содержит Properties
свойство, содержащее дочерние свойства, а также Name
и Value
каждого $Stats
свойства.
Другими словами, чтобы узнать имя первого $Stats[0]
свойства (он же первый столбец), вы можете сделать:
$Stats[0].PSObject.Properties.Name[0]
ColumnHeader
И получить все значения этого столбца:
$ColumnName = $Stats[0].PSObject.Properties.Name[0]
$Stats.$ColumnName
Или:
$Stats.($Stats[0].PSObject.Properties.Name[0])