# シート名 $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変換
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に変更
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
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で日経平均をスクレイピング
$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
キャッシュレス決済の地図より加盟店一覧をスクレイピング
出典:キャッシュレス・消費者還元事業
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()]