Как создать экземпляр объекта и задать поля-члены с помощью PowerShell? - PullRequest
0 голосов
/ 16 февраля 2020

Я пытаюсь выяснить , как создать объекты, установить поля для этого объекта, а затем добавить объект в коллекцию.

В частности, как я могу создать $newPerson где Name - это поле "joe", а array состоит из "phone1, phone2, phone3"? Точно так же у «sue» есть массив «cell4 et c» и «alice» с ее атрибутами и так далее. В конечном итоге, чтобы поместить эти три объекта в массив объектов, $collectionOfPeople?

вывод:

thufir@dur:~/flwor/csv$ 
thufir@dur:~/flwor/csv$ pwsh import.ps1 
people name
joe name
phone1 attribute
phone2 attribute
phone3 attribute
sue name
cell4 attribute
home5 attribute
alice name
atrib6 attribute
x7 attribute
y9 attribute
z10 attribute
thufir@dur:~/flwor/csv$ 

код:

$tempAttributes = @()
$collectionOfPeople = @()

function attribute([string]$line) {
  Write-Host $line  "attribute"
  $tempAttributes += $line
}
function name([string]$line) {
  Write-Host $line  "name"

  #is a $newPerson ever instantiated?
  $newPerson = [PSCustomObject]@{
    Name       = $line
    Attributes = $tempAttributes
  }
  $newPerson  #empty?  no output
  $collectionOfPeople += $newPerson
  $tempAttributes = @()
}

$output = switch -regex -file people.csv {

  '\d' { attribute($_) ; $_ }
  default { name($_); $_ }
}
#how to read the file from top to bottom?
#[array]::Reverse($output)

#$output

$collectionOfPeople  #empty???

ввод из CSV file:

people
joe
phone1
phone2
phone3
sue
cell4
home5
alice
atrib6
x7
y9
z10

В приведенном выше CSV между записями нет маркера, поэтому я использую оператор if для предположения , что каждые атрибут имеет цифры, а имена никогда не имеют цифр.

1 Ответ

1 голос
/ 16 февраля 2020

Вы можете сделать что-то вроде следующего, что близко соответствует вашей текущей логике c. Это предполагает, что порядок данных в вашем файле в точности соответствует указанному вами. .

switch -regex -file people.csv {
   '\d' { $Attributes.Add($_) }
   default { 
      if ($Attributes -and $Name) { 
          [pscustomobject]@{Name = $Name; Attributes = $Attributes}
      }
      $Name = $_
      $Attributes = [Collections.Generic.List[string]]@()
   }
}
# Output Last Set of Attributes
[pscustomobject]@{Name = $Name; Attributes = $Attributes}
# Cleanup 
Remove-Variable Name
Remove-Variable Attributes

Если для имени нет атрибутов, это имя игнорируется. Эту функцию можно изменить, добавив условие elseif ($Name) { [pscustomobject]@{Name = $Name; Attributes = $null} } в блоке default.

...