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

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

ただいまの
回答率

90.51%

  • C

    3701questions

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

  • C++

    3457questions

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

  • コードレビュー

    41questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 818

can110

score 10322

前提・実現したいこと

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ツールがある旨の記載あり。動作は未確認。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

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

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

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

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

ご参考までに。

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

@echo off

setlocal

setlocal enabledelayedexpansion

title CppCheck結果 XML⇒CSV変換

if "%~1"=="" goto :EXIT

set SRC_FILE=%~f1
set DST_FILE=%~dpn1.csv

echo %SRC_FILE%

if not exist !SRC_FILE! echo is not exist! & goto :EXIT

echo%DST_FILE%

rem PowerShellScript  Line 50-60
powershell -NoLogo -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\" | ?{ ($_.readcount -ge 50) -and ($_.readcount -le 60) })-join \"`n\");&$s" """%SRC_FILE%""" """%DST_FILE%"""

start "" "%DST_FILE%" 


:EXIT

echo -------------------------------------------------------------------------------
echo 処理結果を確認した後、何かキーを押してください . . .
echo.
pause >NUL

endlocal
goto :EOF















# ------------------------------------------------------------------------------
# PowerShellScript  Line 50-60
# ------------------------------------------------------------------------------
Add-Type -AssemblyName System.Web
$xmlResult = [xml](Get-Content $Args[0])
$xmlResult.results.error `
    | Select-Object file,line,severity,id,msg `
    | Sort-Object severity,id `
    | %{ $_.msg = [System.Web.HttpUtility]::HtmlDecode($_.msg); return $_ } `
    | Export-Csv -Path cppcheck.csv -NoTypeInformation
# ------------------------------------------------------------------------------

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/23 09:33

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

    キャンセル

  • 2017/02/23 22:33

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

    キャンセル

  • 2017/02/23 22:48

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

    キャンセル

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/22 21:49

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

    すでに解析済みの.xml出力データを整形する手段の回答も待ったのちにクローズしたいと思います。

    キャンセル

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ファイル。

# cppcheckの解析結果.xmlを.tsvに変換する
#
Add-Type -AssemblyName System.Web

$xmlPath = ""
if( $args.Length -ge 1){
    $xmlPath = $args[0]
}
if( $xmlPath.Length -le 0){
    Write-Host "対象xmlが指定されていません。"
    exit 0
}

$tsvPath = $xmlPath + ".tsv"

Write-Host "対象xml:" $xmlPath
Write-Host "出力tsv:" $tsvPath

$xmlRes = [xml](Get-Content $xmlPath)

# CUIから出力されたXML <errors>内に<error>がある。file,lineは<location>内にある。
# <errors><error id="~"><location file="~" line="~"></location><location ~></location>~</errors>
if( $xmlRes.results.errors){
    $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)}}
}
# GUIから出力されたXML file,line,idは<error>内にある。
# <error id="~" file="~" line="~"></error><error>~
else{
    $data = $xmlRes.results.error | Select file,line,id,severity,@{Name="msg"; Expression={[System.Web.HttpUtility]::HtmlDecode($_.msg)}}
}
#echo ($data | Select file,line,id,severity,msg)

# TSV出力
$data | Export-Csv -Path $tsvPath -NoTypeInformation -Delimiter "`t"

Read-Host "終了しました。Enterキー入力してください。" 

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3701questions

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

  • C++

    3457questions

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

  • コードレビュー

    41questions

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