まずは昨日の続き。
PowerShell を使って ルートヒストリーのドライブログ(gpxファイル)を csv変換したところ、各データが引用符で囲まれていました。
使用に支障ないもののデータ量が増えるので、引用符が付かないようGoogle検索に与える指示をいくつか変えてみたら、今度は高度のデータが残ってしまいました。
昨日も記したように、gpxに記録されている高度データはジオイド高なので直接役に立ちません。
正確な緯度・経度を地理院地図にプロットすれば標高値は得られるのでジオイド高は不要なのです。
これまで得られたスクリプトを読んでみたら、引用符(”)を replaceするよりは 高度データを書き出さないようにする方が簡単なことに気付きました。
Ele = $trkpt.ele の行を # でコメントアウトするだけです。
↓ 完成した PowerShellスクリプト。
------------------------------------
# ドラッグ&ドロップされたファイルを取得
$inputFile = $args[0]
if (-not $inputFile) {
Write-Host "GPXファイルをこのスクリプトにドロップしてください。" -ForegroundColor Yellow
pause; exit
}
# 出力ファイル名(元のファイル名 + _jst.csv)
$outputFile = [System.IO.Path]::ChangeExtension($inputFile, "_jst.csv")
# GPX(XML)の読み込み
[xml]$gpx = Get-Content $inputFile
# データの抽出と変換
$results = foreach ($trkpt in $gpx.gpx.trk.trkseg.trkpt) {
# UTC時刻をDateTime型に変換
$utcDate = [DateTime]::Parse($trkpt.time)
# JST (+9時間) に変換
$jstDate = $utcDate.AddHours(9)
# 日付と時刻を分離してカスタムオブジェクト作成
[PSCustomObject]@{
Lat = $trkpt.lat
Lon = $trkpt.lon
# Ele = $trkpt.ele
Date = $jstDate.ToString("yyyy/MM/dd")
Time = $jstDate.ToString("HH:mm:ss")
}
}
# CSVの生成(ダブルクォーテーションなしで出力)
# PowerShell 7以降なら -UseQuotes Never が使えますが、
# Windows標準(5.1)でも動くよう文字列操作でクォートを除去します
$csvContent = $results | ConvertTo-Csv -NoTypeInformation
$csvContent = $csvContent | ForEach-Object { $_ -replace '"', '' }
# ファイル保存(UTF-8/Shift-JISなど必要に応じて変更可)
$csvContent | Out-File -FilePath $outputFile -Encoding Default
Write-Host "変換完了: $outputFile" -ForegroundColor Green
pause
------------------------------------
これを呼び出す batファイルに gpxファイルをドロップすれば OKです。
どうやら余分な部分もあるようですが、中身については全く分からないので最適化はしないつもり。
気をよくしたついでに、csvファイルを間引いてデータ量を減らす作業も vbsで試してみました。
今までハイドラのドライブログ(csv)を地理院地図(https://maps.gsi.go.jp/)にドロップして遊んでいましたが、半日のドライブデータとなるとなかなか重くて扱いづらい面がありました。
表計算ソフトを使って十分の一に間引くのも結構煩雑です。↓
https://minkara.carview.co.jp/userid/260936/blog/48406741/
この作業をドロップ一発でやってもらいます。
-------------------------------------
Option Explicit
' --- 設定 ---
Dim extractInterval
extractInterval = 10 ' 何行に1行抽出するか
' -----------
Dim objArgs, objFSO, inputFile, outputFile
Dim inputFileObj, outputFileObj
Dim strLine, lineCount, headerLine
Set objArgs = WScript.Arguments
If objArgs.Count = 0 Then
MsgBox "CSVファイルをこのスクリプトにドラッグ&ドロップしてください。"
WScript.Quit
End If
Set objFSO = CreateObject("Scripting.FileSystemObject")
inputFile = objArgs(0)
' 出力ファイル名の設定(元のファイル名 + _10)
outputFile = objFSO.GetParentFolderName(inputFile) & "\" & _
objFSO.GetBaseName(inputFile) & "_10." & _
objFSO.GetExtensionName(inputFile)
' ファイル読み込み(UTF-8対応が必要な場合はADODB.Streamを使用)
Set inputFileObj = objFSO.OpenTextFile(inputFile, 1)
Set outputFileObj = objFSO.CreateTextFile(outputFile, True)
lineCount = 0
Do Until inputFileObj.AtEndOfStream
strLine = inputFileObj.ReadLine
If lineCount = 0 Then
' ヘッダー行は必ず出力
outputFileObj.WriteLine strLine
Else
' 10行に1行抽出 (11, 21, 31...)
' 1行目以降のデータ行に対して1行目(2)からカウント開始するため
If (lineCount - 1) Mod extractInterval = 0 Then
outputFileObj.WriteLine strLine
End If
End If
lineCount = lineCount + 1
Loop
inputFileObj.Close
outputFileObj.Close
MsgBox "抽出が完了しました。" & vbCrLf & outputFile
-------------------------------------
文字のエンコードには注意が必要なようですが、通常使用には問題なく使えました。
こちらも中身については全く分かりません。
ただ Google検索に指示を出し、提示されたスクリプトで vbsファイルを作っただけです。
便利で時短になると喜ぶべきか、頭を使わないようになっていくと嘆くべきか。
とりあえず使う場面を精選し、慎重に付き合っていこうと思います。