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

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

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

Mercurialとはオープンソースの分散型バージョン管理システムです

Q&A

解決済

1回答

1836閲覧

対象ログの除外

maihama

総合スコア17

Mercurial

Mercurialとはオープンソースの分散型バージョン管理システムです

0グッド

0クリップ

投稿2017/03/30 04:28

編集2017/03/30 06:43

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

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

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

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

java

1import java.io.IOException; 2 3public class log { 4 public static void createlog() throws IOException , InterruptedException{ 5 //ログ抽出 6 Process runtimeProcess = Runtime.getRuntime().exec("hg log -b test >> logs.xls"); 7 int processCompleted = runtimeProcess.waitFor(); 8 } 9}
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

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

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

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

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

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

ttyp03

2017/03/30 05:26

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

2017/03/30 06:42

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

回答1

0

ベストアンサー

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

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

  • { を含む行が来たら、その行から、} が出てくるまでの行を出力しない。
  • それ以外の行は普通に出力する

というような処理を行うプログラムを書く(awk スクリプトでできそうな気もしますが)。

意図を汲んでサンプル

Java

1public class log { 2 public static void createlog() throws IOException , InterruptedException{ 3 //ログ抽出 4 Process runtimeProcess = Runtime.getRuntime().exec("hg log -b test >> temp.txt"); 5 int processCompleted = runtimeProcess.waitFor(); 6 7 BufferedReader br = new BufferedReader(new FileReader("temp.txt")); 8 BuffererWriter bw = new BufferedWriter(new FileWriter("result.txt")); 9 String line; 10 bool inBlock = false; 11 bool writeFlg = true; 12 List<String> block = new ArrayList<String>(); 13 while( (line = br.readLine()) != null) { 14 if (line.equals("{")) { 15 // ブロック始まり 16 inBlock = true; 17 continue; 18 } else if (line.equals("}") && inBlock) { 19 // ブロック終わり 20 if (writeFlg) { 21 bw.write("{"}); bw.newLine(); 22 for(String l: block) { 23 bw.write(l); bw.newLine(); 24 } 25 bw.write("}"); bw.newLine(); 26 } 27 writeFlg = true; 28 inBlock = false; 29 block.clear(); 30 continue; 31 } 32 if (line.startsWith("ブランチ") { 33 continue; 34 } 35 if (line.startsWith("要約:次とマージ") && inBlock) { 36 writeFlg = false; 37 continue; 38 } 39 if (inBlock) { 40 block.add(line); 41 } else { 42 bw.write(line); bw.newLine(); 43 } 44 } 45 bw.close(); 46 br.close(); 47 } 48}

投稿2017/03/30 05:02

編集2017/03/30 07:48
tacsheaven

総合スコア13703

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

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

maihama

2017/03/30 05:12

tacsheavenさん 回答ありがとうございます。言葉足らずで申し訳ありません。ブランチを出力させたくないという点はEXCELファイル出力時にブランチの行のみ除外したいという意味でした。 やはりできればの部分は手作業なのですね ありがとうございます
退会済みユーザー

退会済みユーザー

2017/03/30 06:21

hgでlogを取り出して「別途加工用にプログラム(マクロ)」のxlsxにjava+poiで、cell挿入して、ダウンロード後、「...(マクロ)」で加工、、、という方針ではなかったでしたっけ?
maihama

2017/03/30 06:49 編集

HouraijiICさん 変更になってしまいまして、一つの単独のexeファイルでlogから編集まで行うように修正してほしいとのことで、今回の質問となりました。 申し訳ありません。
tacsheaven

2017/03/30 07:02

hg log -b test の出力結果はテキストファイルですよね。だから、 1. Java から hg を呼び出してテキストファイルを作る(←これは既にできている) 2. Java が作り終わったテキストファイルを読み込み、不要な部分を削除した「別のテキストファイル」を吐き出す ってやればいい話であって、一つのプログラムで賄うことはできるんですよ。幸い 1. が終わるのを待つこともできていますから(WaitFor())、2. をそのあとに続けて処理させるだけですし。
maihama

2017/03/30 07:08

tacsheavenさん 一かい作ってもう一回除外できるように作成しなおすという考えはありませんでした。除外指定はどのようにおこなえばよろしいのでしょうか?
tacsheaven

2017/03/30 07:15

2. の部分は結局、元のテキストファイルを開いて、1行ずつ読み込んで、1行ずつ別のテキストファイルに書き出す、という処理になるはずです。 ですから「読みこんできた行を解析して、除外対象だったら出力しない」というのをプログラムにしてやればいい。 単純な行単位の削除(ブランチの記述)なら、文字列比較して弾けばいいし、複雑な複数行の削除(要約 マージ)なら、そこからブロックが終わるまで(終わる行を判定することはできるはずです)出力しない、と。
maihama

2017/03/30 07:20

tacsheavenさん ありがとうございます。やってみようと思います。
退会済みユーザー

退会済みユーザー

2017/03/30 07:56

> 一つの単独のexe と言うのが気になります。 javaで行きます? bat起動でcmd窓が残っても良いなら問題無いですが。 嫌がられたらvbsで何とかjarを起動してvbsを閉じてが通じるか。 小生、まだ、jarのexe化起動に成功してないのです。
maihama

2017/03/30 08:13 編集

HouraijiICさん http://garden.telmina.com/2012/05/03/jsmooth/ 上記サイトを参照して頂ければよろしいかと存じます 私も試していないので申し訳ないのですが、サイトを調べてみるとできるそうなのです
退会済みユーザー

退会済みユーザー

2017/03/30 08:43

jsmooth ざっと見、なんかやれそうですね。 明日にでも試してみます。
退会済みユーザー

退会済みユーザー

2017/03/31 00:13

出来ました。あのlaunch4jでの「わけわかめ」は何だったんだろう? ていうくらいあっさりと。 ただし、1exeではなく、jarをexe起動にするだけで、xml,(lib).jar,(jre)は同一ファイルに置いて、zipにして配布の考えの様です。
maihama

2017/03/31 01:31

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

退会済みユーザー

2017/03/31 01:58

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

2017/03/31 02:15 編集

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問