PowerShellでExcelの指定シートのセルを取得

# シート名
$name = 'Sheet1'

# 抽出セル
$cell = @('A1:D2', 'A1:D1', 'A2', 'B2', 'C2', 'D2')

# 抽出データリスト
$data = @()

# 拡張子変更
$newtext = $args[0] -replace '\.xlsx$', '.txt'

$excel = New-Object -ComObject Excel.Application

# Excel非表示
$excel.Visible = $false

$book = $excel.Workbooks.Open($args[0])
$sheet = $book.Sheets($name)

# データ抽出
foreach ($i in $cell) { $sheet.Range($i) | ForEach-Object { $data += $_.Text } }

# 改行で結合後、ファイルに出力
$data -join "`n" | Out-File -Encoding UTF8 $newtext

$book.Close($false)

# Excelを閉じる
$excel.Quit()

# プロセスを解放する
$excel = $null
[GC]::Collect()

PowerShellでキャッシュレス・消費者還元事業事務局審査を通過した加盟店一覧をワンライナーでTSV変換

qiita.com

PowerShellワンライナーでできるか試してみた

PDFBOXだと改行されないので2行の処理がいらないのでpdftotextより簡単

標準出力がShift-JISなのでsjisにすると

java -jar pdfbox-app-2.0.17.jar ExtractText -startPage 3 -sort -console -encoding sjis | Select-String -Pattern "(^\d{1,3}(,\d{3})?)\s(\S{2,3}(都|道|府|県))\s+(\S{1,7}(市|区|町|村))\s+(.+)\s+(\S+)\s+(\S+)\s+([2|5]%)$" | ForEach-Object { $data = @(); foreach ( $i in @(1, 3, 5, 7, 8, 9, 10)) { $data += ($_.Matches.Groups[$i].value) }; $data -join "`t" } | Out-File -Encoding UTF8 .\output.tsv

かなりの数文字化けが発生

ロケールUTF-8に変更

imabari.hateblo.jp

java -jar pdfbox-app-2.0.17.jar ExtractText -startPage 3 -sort -console kameiten_touroku_list.pdf | Select-String -Pattern "(^\d{1,3}(,\d{3})?)\s(\S{2,3}(都|道|府|県))\s+(\S{1,7}(市|区|町|村))\s+(.+)\s+(\S+)\s+(\S+)\s+([2|5]%)$" | ForEach-Object { $data = @(); foreach ( $i in @(1, 3, 5, 7, 8, 9, 10)) { $data += ($_.Matches.Groups[$i].value) }; $data -join "`t" } | Out-File -Encoding UTF8 .\output.tsv
java -jar pdfbox-app-2.0.17.jar ExtractText -startPage 3 -sort -console kameiten_touroku_list.pdf | Select-String -Pattern "(^\d{1,3}(,\d{3})?)\s(\S{2,3}(都|道|府|県))\s+(\S{1,7}(市|区|町|村))\s+(.+)\s+(\S+)\s+(\S+)\s+([2|5]%)$" | ForEach-Object { @($_.Matches.Groups[1, 3, 5, 7, 8, 9, 10].Value) -join "`t" } | Out-File .\output.tsv

PowerShellでキャッシュレス決済の地図より加盟店一覧をスクレイピング

# 座標からJSON取得
$response = Invoke-RestMethod -Uri 'https://api.cashless.go.jp/location/' -Method Get -Body @{ 'lat'=35.681236; 'lng'=139.76712499999996; 'limit'=30; 'd'=15000; 'q'=''; 'b'=''; 'c'=''; 'r'=''; 'p'='';}

# JSONから店番号を取得、店番号から店情報を取得し、CSV変換
$response.items | Get-Member -MemberType Properties | Select-Object -ExpandProperty Name | ForEach-Object {$response.items.($_)} | ForEach-Object { (Invoke-RestMethod ('https://api.cashless.go.jp/location/' + $_))} | Export-Csv .\output.csv -NoTypeInformation -Append -Encoding UTF8
# このオブジェクトの
$response.items |

# プロパティから
Get-Member -MemberType Properties |

# プロパティ名を取得
Select-Object -ExpandProperty Name |

# プロパティ名を使って変数でメンバー名を指定
ForEach-Object {$response.items.($_)} |

# 中のデータからお店番号からJSON取得しPSCustomObjectに変換
ForEach-Object { (Invoke-RestMethod ('https://api.cashless.go.jp/location/' + $_))} |

# CSVに追記書き出し
Export-Csv .\output.csv -NoTypeInformation -Append -Encoding UTF8

docs.microsoft.com

mseeeen.msen.jp

powershell.web.fc2.com

PowerShellでキャッシュレス・消費者還元事業事務局審査を通過した加盟店一覧をCSV変換

# 抽出用
$p = "(^\d{1,3}(,\d{3})?)\s(\S{2,3}(都|道|府|県))\s+(\S{1,7}(市|区|町|村))\s+(.+)\s+(\S+)\s+(\S+)\s+([2|5]%)$"

# TSV
Get-Content kameiten_touroku_list.txt -Encoding UTF8 | Select-String -Pattern $p | ForEach-Object { $data = @(); foreach ( $i in @(1, 3, 5, 7, 8, 9, 10)) { $data += ($_.Matches.Groups[$i].value) }; $data -join "`t" } | Out-File .\output.tsv

#CSV
Get-Content kameiten_touroku_list.txt -Encoding UTF8 | Select-String -Pattern $p | ForEach-Object { $data = @(); foreach ( $i in @(1, 3, 5, 7, 8, 9, 10)) { $data += ($_.Matches.Groups[$i].value) }; $data -join "`t" } | ConvertFrom-CSV -header 'No.', '都道府県', '市区町村', '事業所名(屋号)', '業種', '区分','還元率' -Delimiter "`t" | Export-Csv .\output.csv -NoTypeInformation -Append -Encoding UTF8

説明

# list.txtをUTF8で1行ずつ取得
Get-Content kameiten_touroku_list.txt -Encoding UTF8 |

# 正規表現で検索、マッチしたら下へ
Select-String -Pattern "(^\d{1,3}(,\d{3})?)\s(\S{2,3}(都|道|府|県))\s+(\S{1,7}(市|区|町|村))\s+(.+)\s+(\S+)\s+(\S+)\s+([2|5]%)$" |

# 目的のマッチを取り出し$dataにまとめてjoinでタグ結合
ForEach-Object { $data = @(); foreach ( $i in @(1, 3, 5, 7, 8, 9, 10)) { $data += ($_.Matches.Groups[$i].value) }; $data -join "`t" } |

# ヘッダーを設定し、タグで分割してCSVオブジェクトを作成
ConvertFrom-CSV -header 'No.', '都道府県', '市区町村', '事業所名(屋号)', '業種', '区分','還元率' -Delimiter "`t" |

# CSVオブジェクトをUTF8で追記書き出し
Export-Csv .\output.csv -NoTypeInformation -Append -Encoding UTF8

PowerShellで日経平均をスクレイピング

winscript.jp

$url = 'https://www.nikkei.com/markets/kabu/'

$html = (Invoke-Webrequest $url).ParsedHTML

$nikkei = $html.getElementsByTagName("span") | Where-Object { $_.className -eq 'mkc-stock_prices' } | ForEach-Object { $_.innerText }

Write-Host $nikkei

imabari.hateblo.jp

imabari.hateblo.jp

imabari.hateblo.jp

imabari.hateblo.jp

キャッシュレス決済の地図より加盟店一覧をスクレイピング

出典:キャッシュレス・消費者還元事業

map.cashless.go.jp

import requests
import pandas as pd

url = 'https://api.cashless.go.jp/location/'

s = requests.Session()

params = {
    "lat":35.681236,
    "lng":139.76712499999996,
    "limit":30,
    "d":15000,
    "q":"",
    "b":"",
    "c":"",
    "r":"",
    "p":"",
}

"""
lat = 緯度

lng = 経度

d=縮尺
15000
100000

b = 業種
X:小売業
Y:サービス業
Z:その他業種

c = カテゴリー
100:総合(非専門)
101:食料品
102:衣料品
103:貴金属・服飾品
104:電化製品
105:家具・調度品
106:書籍・玩具・音楽CD
108:ガソリンスタンド
109:その他小売

110:飲食業
111:宿泊業
112:公共料金
113:理容・美容業
114:運輸業

115:その他サービス
199:その他

r = 還元率
2:2%
5:5%

p = 決済手段 ※カンマで結合
1:VISA
2:Mastercard
3:JCB
4:AMERICAN EXPRESS
5:Diners Club
6:交通系IC
7:nanaco
8:WAON
9:楽天Edy
10:iD
11:QUICPay
12:LINE Pay
13:PayPay
14:Origami Pay
15:楽天Pay
16:d払い
17:J-Debit
18:au PAY
19:メルペイ
30:その他ブランド/サービス
"""
r = s.get(url, params=params)

print(r.json())

data = r.json()

# 位置情報
df_loc = pd.concat([pd.read_json(url+k, orient='index') for k in data["items"].keys()])
df_loc.set_index('id', inplace=True)
df_loc

# 店舗情報
df_store = pd.concat([pd.read_json(url+str(i), lines=True) for v in data["items"].values() for i in v])
df_store.set_index('id', inplace=True)
df_store

print(len(df_loc), len(df_store))

df = df_store.join(df_loc)
df

# 重複確認
df[df.duplicated()]