実現したいこと
VBAでログデータの組み合わせを判定するプログラムを作りたいです。
セルAに格納されたデータから{}の組み合わせを判断し、ブロックの組み合わせを自動判定する
プログラムを書きたいと思っています。
ここに実現したいことを箇条書きで書いてください。
- ログデータの{の位置と終わりの位置の}、の組み合わせをマクロもしくはPythonで自動判別し、
一まとまりのデータを別セルに記載するようなプログラムを書きたいです。
発生している問題・エラーメッセージ
実行エラーが起きているのではないのですが、出力されるデータが間違えています。
該当のソースコード
Sub ParseAndWriteBlocks()
' 対象のデータをA1から取得
Dim rawData As String
rawData = Range("A1").Value
' 新しいシートを作成 Dim newSheet As Worksheet Set newSheet = Worksheets.Add ' 開始と終了の位置を特定して新しいシートに書き込む ParseAndWriteBlocksPositions rawData, newSheet
End Sub
Sub ParseAndWriteBlocksPositions(rawData As String, targetSheet As Worksheet)
' 開始位置のキーワード
Dim startKeyword As String
startKeyword = "supportedBandCombination-r10"
' 開始カッコのキーワード Dim startBlockKeyword As String startBlockKeyword = "{" ' 閉じカッコのキーワード Dim endBlockKeyword As String endBlockKeyword = "}" ' カンマのキーワード Dim commaKeyword As String commaKeyword = "," ' ブロックごとに処理 Dim startIdx As Integer Dim startBlockIdx As Integer Dim endBlockIdx As Integer Dim endIdx As Integer startIdx = 1 Do While startIdx > 0 ' 開始位置を検索 startIdx = InStr(startIdx, rawData, startKeyword) If startIdx > 0 Then ' 開始位置が見つかった場合、開始カッコを検索 startBlockIdx = InStr(startIdx, rawData, startBlockKeyword) If startBlockIdx > 0 Then ' 対応する閉じカッコを検索 endBlockIdx = FindMatchingBracket(rawData, startBlockIdx, startBlockKeyword, endBlockKeyword) If endBlockIdx > 0 Then ' ブロックのデータを取得 Dim blockData As String blockData = Mid(rawData, startBlockIdx, endBlockIdx - startBlockIdx + Len(endBlockKeyword)) ' 新しいシートに書き込む targetSheet.Cells(targetSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = blockData ' 次の開始位置を更新 startIdx = endBlockIdx + Len(endBlockKeyword) Else ' 対応する閉じカッコが見つからなかった場合、エラーメッセージを表示して終了 MsgBox "対応する閉じカッコが見つかりませんでした。", vbExclamation Exit Sub End If End If End If Loop
End Sub
Function FindMatchingBracket(rawData As String, startIdx As Integer, startKeyword As String, endKeyword As String) As Integer
' 対応する閉じカッコを検索する関数
Dim openCount As Integer openCount = 1 ' 検索を開始する位置 Dim searchIdx As Integer searchIdx = startIdx + Len(startKeyword) ' 開始カッコの次から順番に検索 Do While searchIdx <= Len(rawData) And openCount > 0 ' カッコが見つかった場合 If Mid(rawData, searchIdx, Len(startKeyword)) = startKeyword Then openCount = openCount + 1 ElseIf Mid(rawData, searchIdx, Len(endKeyword)) = endKeyword Then openCount = openCount - 1 End If ' 次の位置に移動 searchIdx = searchIdx + 1 Loop ' 閉じカッコが見つかった場合、その位置を返す If openCount = 0 Then FindMatchingBracket = searchIdx Else FindMatchingBracket = 0 End If
End Function
このプログラムを実行すると
supportedBandCombination-r10
{
{
{
bandEUTRA-r10 1,
bandParametersUL-r10
{
{
ca-BandwidthClassUL-r10 a
}
これがひとかたまりのものと判断され、正しいデータが抽出できていません。
supportedBandCombination-r10 という文字の下にあるかっこ
{
ここがスタート位置でそこからカーソルを真下に持ってきた
},
ここがブロックの終了位置ですが、チャットGPTは正しくプログラムを作り出すことができません。
{
{
{
bandEUTRA-r10 1,
bandParametersUL-r10
{
{
ca-BandwidthClassUL-r10 a
}
},
bandParametersDL-r10
{
{
ca-BandwidthClassDL-r10 a,
supportedMIMO-CapabilityDL-r10 twoLayers
}
}
}
},
これが一つのまとまりのデータでその次からは真下にある
{
{
bandEUTRA-r10 3,
bandParametersUL-r10
{
{
ca-BandwidthClassUL-r10 a
}
},
bandParametersDL-r10
{
{
ca-BandwidthClassDL-r10 a,
supportedMIMO-CapabilityDL-r10 twoLayers
}
}
}
},
このブロックまでが2つめのブロックなり、{で始まったものは}、で終わり位置的に上下の対応関係を
判断して、データを整理したいのですが、正しいロジックを作り出すのが難しいです。
データの自動仕分けプログラムのロジックを作り出せる方がいらっしゃいましたらお知恵を拝借させていただきたいです。
VBA
12### 3 4スタートは supportedBandCombination-r10これより真下の{で始まり 5ブロックの終点はそれよりカーソルを下に下した},かっことじとハイフンの組み合わせで 6終点としたいですが、ハイフンがついていない}ばかりが出力されてどういう指示を与えたらAIが理解できるのか、 7もしくはどうプログラムを修正すると目的のものができるかわかりません。 8もし、1ブロックでも正しい組み合わせが抽出できたらそこから少しずつ改良を加えて発展させたいのですが 9難航しています。もし解決法ご存じの方いらっしゃいましたらご教示いただきたいです。 10
0 コメント