質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

4304閲覧

Cppcheck結果をID順にソートして確認したい

can110

総合スコア38252

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2017/02/22 09:20

編集2023/01/17 16:08

前提・実現したいこと

GUI版Cppcheckの一覧画面にはID列を表示することができます。
一覧画面
このID値は、解析内容をグルーピングして確認するのに有用です。
一覧画面のID列ヘッダクリックにてID順に並び替えられますが、ファイルをまたいで並び替えができないようです。

複数ファイルにまたがってID順にソートして内容を確認したいです。
実行環境はWindows10x64です。

試したこと

・結果を.csv出力できるが、ID列は出力されない。
・同じく.xml出力でき、こちらではIDが属性値として出力されることが確認できたが、.xmlなのでエディタなどでも確認しずらい。

2017/02/22時点の調査結果

・一覧の表示設定なりで「ファイルをまたいで並び替え」ができないか?
→ヘルプを確認した限り、できない。

・CSV出力の設定なりでID列を出力できないか?
→回答をうけ、cppcheck.exeにて解析結果を任意フォーマットで出力できることが確認できました。

・CppCheckで出力された.xmlを見やすい表形式にできないか?(すでにそんなツールはないか?)
→ヘルプ(Chapter 11. HTML report)にHtmlにて出力できるpythonツールがある旨の記載あり。動作は未確認。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

・CppCheckで出力された.xmlを見やすい表形式にできないか?(すでにそんなツールはないか?)

PowerShellを使用して、XMLデータをCSV化してみてはいかがでしょう?
2行で実現できます。

PowerShell

1$xmlResult = [xml](Get-Content cppcheck.xml) 2$xmlResult.results.error | Select file,line,id,severity,msg | Export-Csv -Path cppcheck.csv -NoTypeInformation 3

【追記】
CppCheckは私もたまに使用するので、結果のXML->CSV変換BATを作成してみました。
「severity と id でのソート」と「msg内のエスケープ文字のデコード」処理を追加しています。

BATファイルに対して、XMLファイルをドロップすれば、同じ場所にCSVファイるが出力されます。

ご参考までに。

※ BATファイル内にPowerShellスクリプト埋め込むテクニックを使用しているので、PowerShellスクリプトの位置(行数)を変更すると、正しく動作しません。

BAT

1@echo off 2 3setlocal 4 5setlocal enabledelayedexpansion 6 7title CppCheck結果 XML⇒CSV変換 8 9if "%~1"=="" goto :EXIT 10 11set SRC_FILE=%~f1 12set DST_FILE=%~dpn1.csv 13 14echo %SRC_FILE% 15 16if not exist !SRC_FILE! echo is not exist! & goto :EXIT 17 18echo ⇒ %DST_FILE% 19 20rem PowerShellScript Line 50-60 21powershell -NoLogo -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\" | ?{ ($_.readcount -ge 50) -and ($_.readcount -le 60) })-join \"`n\");&$s" """%SRC_FILE%""" """%DST_FILE%""" 22 23start "" "%DST_FILE%" 24 25 26:EXIT 27 28echo ------------------------------------------------------------------------------- 29echo 処理結果を確認した後、何かキーを押してください . . . 30echo. 31pause >NUL 32 33endlocal 34goto :EOF 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50# ------------------------------------------------------------------------------ 51# PowerShellScript Line 50-60 52# ------------------------------------------------------------------------------ 53Add-Type -AssemblyName System.Web 54$xmlResult = [xml](Get-Content $Args[0]) 55$xmlResult.results.error ` 56 | Select-Object file,line,severity,id,msg ` 57 | Sort-Object severity,id ` 58 | %{ $_.msg = [System.Web.HttpUtility]::HtmlDecode($_.msg); return $_ } ` 59 | Export-Csv -Path cppcheck.csv -NoTypeInformation 60# ------------------------------------------------------------------------------

投稿2017/02/22 14:53

編集2017/02/23 11:24
KenjiToriumi

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/02/23 00:33

回答ありがとうございます。 提示いただいたコードで.xmlから.CSVに変換できました。 元XML中の数値文字参照「'」(=「'」)がそのまま出力されていますが、変換できるかはのちに調べてみたいと思います。
can110

2017/02/23 13:33

追記回答ありがとうございます。 System.Web.HttpUtility::HtmlDecode、大変参考になりました。 この質問後、GUI版とCUI版でのXML出力結果の違いも考慮した.ps1スクリプトを作成したのですが 週明けにはHtmlDecodeも組み込んでみたいと思います。
can110

2017/02/23 13:48

ざっと組み込んだところ、うまく動作しましたので結果を自己回答にまとめました。 あらためまして回答ありがとうございました。
guest

0

コマンドライン用のcppcheck.exeで、
--template='{file}:{line},{severity},{id},{message}'
という風に結果出力のフォーマットを指定してやれば可能ですよ。

GUIを使用する場合と違いその他のパラメータ指定が面倒ですが、一度BAT化してしまえば逆に再実行などは楽です。

投稿2017/02/22 11:14

KenjiToriumi

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/02/22 12:49

回答ありがとうございます。 「cppcheck.exe ~ --template={file}\t{line}\t{severity}\t{id}\t{message} 2>res.tsv」 という感じで解析結果をタブ区切りでも出力できることが確認できました。 たしかにコマンドラインだと解析自動化できて便利そうですね。 すでに解析済みの.xml出力データを整形する手段の回答も待ったのちにクローズしたいと思います。
guest

0

KenjiToriumiさんから回答いたたいだXML中の文字参照を実体に変換する処理を加えて
cppcheck解析結果の.xml.tsv(タブ区切り)に変換するスクリプトが作成できました。
GUI版とCUI版で出力XML構造が異なっていたので、それにも対応してみました。

.xmlファイルをこの.batファイルにドロップすることで同名の.ps1ファイルへ処理を渡す。

@echo off rem ---------------------------------------------------------------------------- rem cppcheckで出力されたXMLをTSVに変換する rem 変換はPowerShecllで行う。 rem PowerShellスクリプトファイル(.ps1)にファイルをドラッグ&ドロップして処理する rem http://qiita.com/harry0000/items/e8c35b8e53cdae513d9d powershell -ExecutionPolicy Unrestricted -File %~dpn0.ps1 %*

実処理を行う.ps1ファイル。

PowerShell

1# cppcheckの解析結果.xmlを.tsvに変換する 2# 3Add-Type -AssemblyName System.Web 4 5$xmlPath = "" 6if( $args.Length -ge 1){ 7 $xmlPath = $args[0] 8} 9if( $xmlPath.Length -le 0){ 10 Write-Host "対象xmlが指定されていません。" 11 exit 0 12} 13 14$tsvPath = $xmlPath + ".tsv" 15 16Write-Host "対象xml:" $xmlPath 17Write-Host "出力tsv:" $tsvPath 18 19$xmlRes = [xml](Get-Content $xmlPath) 20 21# CUIから出力されたXML <errors>内に<error>がある。file,lineは<location>内にある。 22# <errors><error id="~"><location file="~" line="~"></location><location ~></location>~</errors> 23if( $xmlRes.results.errors){ 24 $data = $xmlRes.results.errors.error | Select @{Name="file"; Expression={$_.FirstChild.file}},@{Name="line"; Expression={$_.FirstChild.line}},id,severity,@{Name="msg"; Expression={[System.Web.HttpUtility]::HtmlDecode($_.msg)}} 25} 26# GUIから出力されたXML file,line,idは<error>内にある。 27# <error id="~" file="~" line="~"></error><error>~ 28else{ 29 $data = $xmlRes.results.error | Select file,line,id,severity,@{Name="msg"; Expression={[System.Web.HttpUtility]::HtmlDecode($_.msg)}} 30} 31#echo ($data | Select file,line,id,severity,msg) 32 33# TSV出力 34$data | Export-Csv -Path $tsvPath -NoTypeInformation -Delimiter "`t" 35 36Read-Host "終了しました。Enterキー入力してください。"

投稿2017/02/23 13:45

can110

総合スコア38252

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問