0

ファイルのコンテンツを取得し、それをフィールドに分割して CSV ファイルに入れる関数が Powershell にあります。リンクから値を取得し、リンク列をそのままにして、CSV ファイルに送信される列に追加する方法があるかどうか疑問に思っています。

function Convert2CSV {
(Get-Content $input_path) -match "href" | % {
$data = ($_ -replace '(?:.*)href="(.*?)">Date:\s*([\w\.]+)\s*([\w\:]+)\s*Item:\s*(.*)</a>(?:.*)' , '$1;$2;$3;$4').Split(";")
New-Object psobject -Property @{
    "Link" = $data[0]
    "Date" = $data[1]
    "Time" = $data[2]
    "Item" = $data[3]
    }
} #| Export-Csv $output_file -NoTypeInformation
}

私が探している値は次のいずれかです

FeedDefault_.*?(&) or _Feed.*?(&)

"Link" = $data[0] 部分に何らかの if ステートメントを追加できると考えてよろしいですか?

要求に応じたサンプル出力。

Value in Link   |   Link                                                                    |   Date        |   Time    |   Item            |
--------------------------------------------------------------------------------------------------------------------------------------------|
bluepebbles     |   http://www.domain.com/page.html?FeedDefault_bluepebbles&something       |   2013-05-19  |   13:30   | Blue Pebbles      |
--------------------------------------------------------------------------------------------------------------------------------------------|
redpebbles      |   http://www.domain.com/page.html?Feed_redpebbles&something               |   2013-05-19  |   13:31   | Red Pebbles       |
--------------------------------------------------------------------------------------------------------------------------------------------|

CSV 形式

Value in Link,Link,Date,Time,Item
"bluepebbles","http://www.domain.com/page.html?FeedDefault_bluepebbles&something","2013-05-19","13:30","Blue Pebbles"
"redpebbles","http://www.domain.com/page.html?Feed_redpebbles&something","2013-05-19","13:31","Red Pebbles"

だから入る

$input_path = 'f:\mockup\area51\files\link.html'
$output_file = 'f:\mockup\area51\files\db_csv.csv'

$tstampCulture = [Globalization.cultureinfo]::GetCultureInfo("en-GB")

$ie = New-Object -COM "InternetExplorer.Application"
$ie.Visible = $false

$ie.Navigate("file:///$input_path")

$ie.document.getElementsByTagName("a") | % {
  $_.innerText -match 'Date:\s*([\w\.]+)\s*([\w\:]+)\s*Item:\s*(.*)'
  $obj = New-Object psobject -Property @{
    "Link" = $_.href
    "Date" = $matches[1]
    "Time" = $matches[2]
    "Item" = $matches[3]
  }
  if ( $obj.Link -match '\?Feed(?:Default)?_(.*?)&' ) {
    $obj | Add-Member –Type "NoteProperty" –Name "LinkValue" –Value $matches[1]
  }
  $obj
} #| Export-Csv $output_file -NoTypeInformation

エラーを返します:

You cannot call a method on a null-valued expression.
At line:12 char:38
+     $ie.document.getElementsByTagName <<<< ("a") | % {
+ CategoryInfo          : InvalidOperation: (getElementsByTagName:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull

だから私はおそらく何かを台無しにしたと確信しています。:)

4

1 に答える 1

1

-matchまず、 の代わりに使用することをお勧めします-replace。結果の$matches配列には、関心のあるサブマッチが既に含まれているため、この配列を手動で作成する必要はありません。

Get-Content $input_path | ? { $_.contains("href") } | % {
  $_ -match 'href="(.*?)">Date:\s*([\w\.]+)\s*([\w\:]+)\s*Item:\s*(.*)</a>'
  $obj = New-Object psobject -Property @{
    "Link" = $matches[1]
    "Date" = $matches[2]
    "Time" = $matches[3]
    "Item" = $matches[4]
  }
  $obj
} #| Export-Csv $output_file -NoTypeInformation

$obj.Link追加情報を 1 秒で抽出し、次-matchの方法でカスタム オブジェクトに追加できAdd-Memberます。

if ( $obj.Link -match '\?Feed(?:Default)?_(.*?)&' ) {
  $obj | Add-Member –Type "NoteProperty" –Name "LinkValue" –Value $matches[1]
}

また、入力ファイルはおそらく HTML ファイルであるため、InternetExplorerCOM オブジェクトの使用を検討する必要があります。これにより、ファイルを 1 行ずつ処理するよりも、抽出されたタグをはるかに適切に制御できます。

$ie = New-Object -COM "InternetExplorer.Application"
$ie.Visible = $false

$ie.Navigate("file:///$input_path")
while ( $ie.Busy ) { Start-Sleep -Milliseconds 100 }

$ie.document.getElementsByTagName("a") | % {
  $_.innerText -match 'Date:\s*([\w\.]+)\s*([\w\:]+)\s*Item:\s*(.*)'
  $obj = New-Object psobject -Property @{
    "Link" = $_.href
    "Date" = $matches[1]
    "Time" = $matches[2]
    "Item" = $matches[3]
  }
  if ( $obj.Link -match '\?Feed(?:Default)?_(.*?)&' ) {
    $obj | Add-Member –Type "NoteProperty" –Name "LinkValue" –Value $matches[1]
  }
  $obj
}
于 2013-05-19T20:15:44.037 に答える