Как изменить несколько заголовков в таблице с помощью Powershell - PullRequest
1 голос
/ 21 января 2020

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

Например, я попытался вручную изменить заголовок 8, GF на GFPG в строке, где я добавляю заголовок ' TEAM ', но я получаю ошибку:

Исключение вызывает "Добавить" с аргументом (ами) "2": "Элемент уже добавлен. Введите словарь:" Добавлен ключ ":" GF "" При C: \ NHLScraper.ps1: 32 char : 5 + $ objHa sh .Add ($ headers [$ j], $ rowdata [$ j])

Мой код:

$url = "https://www.hockey-reference.com/leagues/NHL_2020.html"

#getting the data
$data = Invoke-WebRequest $url

#grab the third table
$table = $data.ParsedHtml.getElementsByTagName("table") | Select -skip 2 | Select -First 1


#get the rows of the Team Statistics table
$rows = $table.rows

#get table headers
$headers = $rows.item(1).children | select -ExpandProperty InnerText

#count the number of rows
$NumOfRows = $rows | Measure-Object

#Manually injecting TEAM header
$headers = @($headers[0];'TEAM';$headers[1..($headers.Length-1)])

#enumerate the remaining rows (we need to skip the header row) and create a custom object
$out = for ($i=2;$i -lt $NumofRows.Count;$i++) {
 #define an empty hashtable
 $objHash=[ordered]@{}
 #getting the child rows
 $rowdata = $rows.item($i).children | select -ExpandProperty InnerText 
 for ($j=0;$j -lt $headers.count;$j++) {
    #add each row of data to the hash table using the correlated table header value
    $objHash.Add($headers[$j],$rowdata[$j])
  }

  #turn the hashtable into a custom object
  [pscustomobject]$objHash
}

$out | Select TEAM,AvAge,GP,W,L,OL,PTS,PTS%,GF,GA,SOW,SOL,SRS,SOS,TG/G,EVGF,EVGA,PP,PPO,PP%,PPA,PPOA,PK%,SH,SHA,PIM/G,oPIM/G,S,S%,SA,SV%,SO -SkipLast 1 | Export-Csv -Path "C:\$((Get-Date).ToString("'NHL Stats' yyyy-MM-dd")).csv" -NoTypeInformation

1 Ответ

0 голосов
/ 21 января 2020

Вы можете добавить условие, чтобы проверить, был ли ключ уже добавлен, и если да, обновить или проигнорировать его,

if (!$objHash.Contains(headers[$j]))
    $objHash.Add($headers[$j],$rowdata[$j])

else
    $objHash[$headers[$j]] = $rowdata[$j] # Overwrite values

Но после просмотра вашего кода несколько раз, это не имеет смысла ,

$out = for ($i=2;$i -lt $NumofRows.Count;$i++) {
 #define an empty hashtable
 $objHash=[ordered]@{}         # Overwritten each loop???
 #getting the child rows
 $rowdata = $rows.item($i).children | select -ExpandProperty InnerText 
 for ($j=0;$j -lt $headers.count;$j++) {
    #add each row of data to the hash table using the correlated table header value
    $objHash.Add($headers[$j],$rowdata[$j])   # Dictionary cannot have duplicate keys
  }

  #turn the hashtable into a custom object
  [pscustomobject]$objHash    # what do you do with this?
}

Вы циклически повторяетесь x раз и каждый раз перезаписываете $ objHa sh. единственное, что будет возвращено, это то, что было создано в последнем l oop.

Предлагаемое решение

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

# If you want to change the header value from GF to GFPG, you can do that in the place you have defined $headers


#get table headers
$headers = $rows.item(1).children | select -ExpandProperty InnerText
$headers = $headers | % { if ($_ -eq "GF") { "GFPG" }  else { $_ }} 

#count the number of rows
$NumOfRows = $rows | Measure-Object

#Manually injecting TEAM header
$headers = @($headers[0];'TEAM';$headers[1..($headers.Length-1)])

#enumerate the remaining rows (we need to skip the header row) and create a custom object
$allData = @{}
$out = for ($i=2;$i -lt $NumofRows.Count;$i++) {
 #define an empty hashtable
 $objHash=[ordered]@{}
 #getting the child rows
 $rowdata = $rows.item($i).children | select -ExpandProperty InnerText 
 for ($j=0;$j -lt $headers.count;$j++) {
    #add each row of data to the hash table using the correlated table header value
    $objHash[$headers[$j]] = $rowdata[$j]        
  }

  #turn the hashtable into a custom object
  [pscustomobject]$objHash
  $allData.Add($i, $objHash)
}

Я использовал $AllData с i в качестве ключа для хранения каждого из этих результатов к нему можно будет получить доступ позже.

...