blah blah

groovy – CharsetToolkit 등등

이번에도 groovy.

간단한 작업 위해 만든 스크립트인데 나중에 써먹을 만한게 몇가지 있어서 적어봅니다.

작업 개요 : 특정 폴더 하위에 있는 모든 폴더의 자바 파일의 인코딩을 MS949 에서 UTF-8 로 전환

간단하니 일단 소스 부터.

import groovy.io.FileType
import groovy.util.CharsetToolkit

folder = "E:\\encoding_test\\data"
result = "E:\\encoding_test\\result"

new File(folder).eachDirRecurse {                            // (1)
    subDir = it.path.replace(folder, "")
    new File("${result}\\${subDir}").mkdirs()           // (2)
}

new File(folder).traverse(type:FileType.FILES, nameFilter:~/.*\.java/) {
    charSet = new CharsetToolkit(it).getCharset();          // (3)
    target = result + it.path.replace(folder, "")

    if(charSet.toString() != "UTF-8") {
        new FileOutputStream(target).withWriter('UTF-8') { writer ->        // (4)
            new FileInputStream(it).withReader('MS949') { reader ->
                writer << reader
            }
        }
    }
    else {
        new AntBuilder().copy (file : it , tofile : target)                           // (5)
    }
}

(1)의 eachDirRecurse() 는 recursive 하게 디렉토리 정보를 구하는 메서드입니다.

( 제 컴 환경에서는 그냥 eachDir() 만으로도 되던데 딴 분 컴에서는 제일 상위의 서브 디렉토리만 찾는 문제가 있더군요. OS 차이 때문일까요? )

(2)에서는 mkdirs() 를 이용해서 결과 파일 저장할 디렉토리 하위에 작업 대상 디렉토리 구조와 동일하게 서브 디렉토리를 만들어 주었습니다.

(3)이 이번 작업하면서 알게된 꽤 유용한 groovy 에서 지원되는 기능인데 … groovy.util.CharsetToolkit 라는 캐릭터셋 처리 위한 패키지가 있더군요.

CharsetToolkit 에서 제공되는 getCharset()이란 메서드를 이용해서 파일의 캐릭터셋을 쉽게 알아낼 수 있습니다.

이걸 쓴 이유는 작업하려는 파일들에 MS949, UTF-8 파일이 섞여 있어서 무조건 인코딩을 바꿔주면 원래 UTF-8 형식이었던 파일은 한글이 깨지는 문제가 발생하더군요.

그래서 처리 전 파일의 캐릭터셋을 미리 확인해서 UTF-8인 경우에는 그냥 인코딩 변환 없이 결과 디렉토리로 복사만 해주었습니다.

(4) 이하 몇 줄은 ‘MS949’ 형식 파일을 UTF-8로 변환해주는거구요.

(5)번은 파일 복사하는 부분입니다.

자바와 마찬가지로 File 클래스에 보면 renameTo()  라는 메서드가 있어서 rename 이나 move 등의 용도로 쓸 수 있습니다. (renameTo 쓰는 예는 지난 번 글에 있으니 참고하세요)

하지만 copy 를 위한 메서드는 따로 있지 않으므로 직접 구현해야 하는데 대신 AntBuilder의 copy 기능을 이용하면 쉽게 처리할 수 있습니다.

( AntBuilder는 별도로 import 처리할 필요도 없습니다 )

이게 전부입니다. 딴거야 자바로 처리해도 크게 아쉬운거 없지만 groovy.util.CharsetToolkit 은 알아두면 꽤 유용하게 쓸 수 있을 듯 싶네요.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s