2013/05/20

[groovy] ファイルを特定の行数に分割する

絶対にもっといい方法があるんだろうけど、groovyを使ってファイルを特定の行数に分割してみた。
ちなみに、1分割する毎にファイルを先頭から読み直しているため、分割する毎に処理が遅くなっていく。
行をスキップできればいいんだけど、途中で調べるのを辞めてしまった。。。

以下ソース
  1. class FileUtils {  
  2.   
  3.  /** 
  4.   * ファイルの行数を返却する 
  5.   *  
  6.   * @param filePath 
  7.   * @param encode 
  8.   * @return 
  9.   */  
  10.  static def countLines(def filePath, def encode) {  
  11.   def lineCount = 0  
  12.   new File(filePath).eachLine(encode) { lineCount++ }  
  13.   lineCount  
  14.  }  
  15.   
  16.  /**  
  17.   * 指定の行数にファイルを分割する 
  18.   * 分割したファイルは分割元ファイルと同じディレクトリに書き出す 
  19.   * @return 
  20.   */  
  21.  static def splitFiles(def dstDir, def filePath, def encode, def lineSplitSize) {  
  22.     
  23.   // 行数を取得する  
  24.   def lineSize = countLines(filePath, encode)  
  25.   
  26.   // 分割数を計算する  
  27.   def splitSize = (lineSize / lineSplitSize).toInteger() + (lineSize % lineSplitSize == 0 ? 0 : 1)  
  28.   println "総行数:${lineSize}/分割行数:${lineSplitSize}/分割ファイル数:${splitSize}"  
  29.     
  30.   // ファイルを分割する  
  31.   (0..<splitsize -="" each="" idx="">  
  32.    def dstFile = new File("${dstDir}/${new File(filePath).name}.${idx}").withWriter(encode) { out ->  
  33.       
  34.     // 開始行数  
  35.     def startLine = idx * lineSplitSize  
  36.     def writeLines = 0  
  37.       
  38.     def start = new Date().time  
  39.     try {  
  40.      int procLine = 0  
  41.      new File(filePath).eachLine(encode) { line ->        
  42.         
  43.       // 開始行に至ったら、内容を書き込む  
  44.       if (procLine >= startLine) {  
  45.        out << "${line}\n"  
  46.        writeLines++  
  47.          
  48.        // 分割行数に至ったら、ループから抜ける  
  49.        if (writeLines == lineSplitSize) {  
  50.         throw new RuntimeException()  
  51.        }  
  52.       }  
  53.       procLine++  
  54.      }  
  55.     } catch (e) {}  
  56.     println "実行時間:${new Date().time - start}"  
  57.    }  
  58.   }  
  59.  }  
  60. }  
  61. </splitsize>  

2013/05/16

Jenkinsで役に立ちそうなプラグイン

CIツールとして名高い「Jenkins」。
プラグインが大量に出回っているので役に立ちそうなのをいくつか紹介します。

JOBの横っちょにcronの設定を表示してくれるプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/Cron+Column+Plugin

これを入れるとcronの設定が一目で確認できるようになります。

次に実行されるジョブをサイドバーに表示してくれるプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/Next+Executions

次に実行されるジョブが簡単に確認できるので、タイマー代わりに使用できそうです。

コンソール出力に時間を表示するプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/Timestamper


各プロジェクトの設定を一括変更できるプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/Configuration+Slicing+Plugin

ファイルをトリガーにジョブを実行できるようにするプラグイン
https://wiki.jenkins-ci.org/display/JENKINS/FSTrigger+Plugin

ファイル監視ジョブを簡単に作れそうです。


ジョブの上下関係を視覚的に表示できるプラグイン

https://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin

上記の他にも見切れないくらいプラグインがあります。
jenkinsは組み合わせ次第で様々な使用方法できそうで、ますます依存してしまいそうです。