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

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

ただいまの
回答率

88.92%

対象ログの除外

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 772

maihama

score 17

前提・実現したいこと

javaでログを抽出しようとしております
ログの抽出とそれをexcelファイル化することができましたが
不要な部分の削除が必要でその方法がわかりません。

実現したいこと:javaからファイルの作成、そのファイルには除外されたもの以外のログが抽出できている

除外条件
下記該当コードのlogs.xls中にある
ブランチ行すべて
(できれば)要約に次とマージと書かれていたら対象の情報すべて

抽出対象ディレクトリ

G:\workspcace_test\test
(該当のソースコードのjavaはそのディレクトリ内にあります)

該当のソースコード

import java.io.IOException;

public class log {
    public static void createlog() throws IOException , InterruptedException{
    //ログ抽出
        Process runtimeProcess = Runtime.getRuntime().exec("hg log -b test >> logs.xls");
        int processCompleted = runtimeProcess.waitFor();
    }
}
logs.xls
(除外対象には*マーク)
リビジョン:5500
*ブランチ:test
ユーザ:testuser
日付:Sun Mar 5 00:00:00 2017 +0900
要約:テスト

(できれば)*{
リビジョン:5499
ブランチ:test
親リビジョン: 5494
親リビジョン: 5497
ユーザ:testuser
日付:Sun Mar 5 00:00:00 2017 +0900
要約:次とマージ 
}

試したこと

xlsではなくtxtにして対応することも可能だったが同様に除外はできなかった

補足情報(言語/FW/ツール等のバージョンなど)

開発環境:Eclipce

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • ttyp03

    2017/03/30 14:26

    内容を見た限りでは、Javaはあまり関係ないし、Excelといっても拡張子をxlsにしているだけで中身は単なるテキストファイルなのでExcel関係ないので、タグをMercurialに変更した方が回答がつくと思いますよ。

    キャンセル

  • maihama

    2017/03/30 15:42

    ttyp03さん かしこまりました。ありがとうございます。

    キャンセル

回答 1

checkベストアンサー

+1

まず、ブランチを出力させたくないなら --template で出力テンプレートを指定してやればよいかと思います。

問題はできれば、の方ですが、これは出力後に手作業で加工するか、別途加工用にプログラムを組むとかですかね。

  •  { を含む行が来たら、その行から、} が出てくるまでの行を出力しない。
  • それ以外の行は普通に出力する
    というような処理を行うプログラムを書く(awk スクリプトでできそうな気もしますが)。

意図を汲んでサンプル

public class log {
    public static void createlog() throws IOException , InterruptedException{
    //ログ抽出
        Process runtimeProcess = Runtime.getRuntime().exec("hg log -b test >> temp.txt");
        int processCompleted = runtimeProcess.waitFor();

        BufferedReader br = new BufferedReader(new FileReader("temp.txt"));
        BuffererWriter bw = new BufferedWriter(new FileWriter("result.txt"));
        String line;
        bool inBlock = false;
        bool writeFlg = true;
        List<String> block = new ArrayList<String>();
        while( (line = br.readLine()) != null) {
            if (line.equals("{")) {
                // ブロック始まり
                inBlock = true;
                continue;
            } else if (line.equals("}") && inBlock) {
                // ブロック終わり
                if (writeFlg) {
                    bw.write("{"}); bw.newLine();
                    for(String l: block) {
                        bw.write(l); bw.newLine();
                    }
                    bw.write("}"); bw.newLine();
                }
                writeFlg = true;
                inBlock = false;
                block.clear();
                continue;
            }
            if (line.startsWith("ブランチ") {
                continue;
            }
            if (line.startsWith("要約:次とマージ") && inBlock) {
                writeFlg = false;
                continue;
            }
            if (inBlock) {
                block.add(line);
            } else {
                bw.write(line); bw.newLine();
            }
        }
        bw.close();
        br.close();
    }
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/31 10:31

    HouraijiICさん jarファイルはやはり同一でないとできないんですね
    わたしは別にしていたためできませんでしたので一緒にしてやってみようと思います

    キャンセル

  • 2017/03/31 10:58

    mainクラスを含んだjarをexeにして起動させる様にするtoolなので、jsmoothのクラスパス設定に必要な自作クラスjarを入れれば動くはずですが。はて?
    mainクラスjarが別々にあったら、それぞれ、別々にjavaかjreで起動してますよね。それを1つのexeには、さすがに出来ないです。

    キャンセル

  • 2017/03/31 11:03 編集

    HouraijiICさん HouraijiICさんの通り同一ファイルに置くことによりできました。
    さすがに一つのexeではできないですね。失礼しました。

    キャンセル

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

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

関連した質問

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