Groovyで、Stringクラス、Fileクラスを拡張してみる
出前味噌ですが、意外と便利です。
Contents
使い方
- クラスパスの通っている場所に、
Extentions.groovy
をおく - 後は使用したいgroovyソースの先頭で、
Extentions.init()
メソッド(static)を実行する
読み込ませ方などの詳細は明日説明します・・・仕事が・・・
追加メソッド
File.lostFiles(dir)
自分自身のディレクトリと引数のディレクトリを比較し、自分自身に存在しないファイルをリストで返します。
File.listEmptyDirs()
空のディレクトリをリストで返します。
String.padRightBytes(count)
文字列の右側をスペース詰めします。groovyのpadRightとの違いは、バイト数を計算してスペース詰めすることです。padRightは文字数でスペース詰めするため、日本語を使用した場合に問題がありました。
String.padLeftBytes(count)
文字列の左側をスペース詰めします。
String.toNarrowCase()
全角文字を半角に変換します。全角文字以外はそのままです。(一部対象外。理由は特になし)
String.toWideCase()
半角文字を全角に変換します。半角文字以外はそのままです。(一部対象外。希望があれば連絡ください)
ソースコード
**こちらのライブ
Extentions.groovy
import org.apache.poi.hssf.usermodel.*
import org.apache.poi.poifs.filesystem.*
class Extentions {
static init = {
File.metaClass.lostFiles = { newdir ->
def thislist = []
def olddir = delegate
olddir.eachFileRecurse { thislist << it.path }
def newlist = []
newdir.eachFileRecurse { newlist << it.path }
newlist = newlist.collect {
it.replace(newdir.path, "")
}
thislist.findAll {
!newlist.contains(it.replace(olddir.path, ""))
}
}
File.metaClass.listEmptyDirs = {
def list = []
delegate.eachFileRecurse {
if (it.isDirectory() && it.listFiles().size() == 0) {
list << it
}
}
list
}
String.metaClass.padRightBytes = { count ->
delegate.padRight(count - (delegate.bytes.size() - delegate.size()))
}
String.metaClass.padLeftBytes = { count ->
delegate.padLeft(count - (delegate.bytes.size() - delegate.size()))
}
String.metaClass.toNarrowCase = {
def wideChars = ('A'..'Z') + ('a'..'z') + ('0'..'9') + (['?', 'ー', '*', '=', '!', '”', '$', '%', '&', '(', ')'])
def narrowChars = ('A'..'Z') + ('A'..'Z') + ('0'..'9') + (['-', 'ー', '*', '=', '!', '"', '$', '%', '&', '(', ')'])
assert wideChars.size() == narrowChars.size()
def text = delegate.toString()
for (i in 0..wideChars.size() - 1) {
text = text.replace(wideChars[i], narrowChars[i])
}
text
}
String.metaClass.toWideCase = {
def wideChars = ('A'..'Z') + ('a'..'z') + ('0'..'9') + (['?', 'ー', '*', '=', '!', '”', '$', '%', '&', '(', ')'])
def narrowChars = ('A'..'Z') + ('A'..'Z') + ('0'..'9') + (['-', 'ー', '*', '=', '!', '"', '$', '%', '&', '(', ')'])
assert wideChars.size() == narrowChars.size()
def text = delegate.toString()
for (i in 0..narrowChars.size() - 1) {
text = text.replace(narrowChars[i], wideChars[i])
}
text
}
HSSFWorkbook.metaClass.'static'.load = { file ->
new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(file.path)));
}
HSSFWorkbook.metaClass.getSheets = {
def list = []
for (i in 0..delegate.getNumberOfSheets() - 1) {
def sheet = delegate.getSheetAt(i)
sheet.metaClass.parent = delegate
list << sheet
}
list
}
org.apache.poi.hssf.usermodel.HSSFSheet.metaClass.cell = {
row, col -> delegate.getRow(row)?.getCell((short) col)
}
org.apache.poi.hssf.usermodel.HSSFSheet.metaClass.cellValue = { row, col ->
def result = 0
//assert delegate.getRow(row):"行${row}がnullです。"
def cell = delegate.getRow(row)?.getCell((short) col)
switch (cell?.cellType) {
case org.apache.poi.hssf.usermodel.HSSFCell.CELL_TYPE_NUMERIC:
result = cell?.numericCellValue
break;
case org.apache.poi.hssf.usermodel.HSSFCell.CELL_TYPE_STRING:
result = cell?.stringCellValue
break;
case org.apache.poi.hssf.usermodel.HSSFCell.CELL_TYPE_BOOLEAN:
result = cell?.booleanCellValue
break;
case org.apache.poi.hssf.usermodel.HSSFCell.CELL_TYPE_FORMULA:
result = cell?.cellFormula
break;
default:
//assert false:"${row}, ${col}が不正"
result = null
break;
}
result
}
java.util.PropertyResourceBundle.metaClass.'static'.load = { file ->
new java.util.PropertyResourceBundle(new java.io.FileInputStream(file))
}
java.util.PropertyResourceBundle.metaClass.'static'.loadProject = {
java.util.PropertyResourceBundle.load(new File("project-ascii.properties"))
}
}
}
ディスカッション
コメント一覧
まだ、コメントがありません