tsv파일의 내용을 추출하여 db로 저장하는 기능이 필요했다.
tsv란? csv는 많이 들어봤는데 tsv는 처음 들어봤다.
TSV(Tab-Separated Values) 파일 형식은 일반 텍스트 형식의 탭으로 구분된 데이터를 나타냅니다. CSV와 유사한 파일 형식은 서로 다른 응용 프로그램 간에 가져오기 및 내보내기를 위해 구조화된 방식으로 데이터를 구성하는 데 사용됩니다.
즉, 기존에 Comma(,)로 구분하는 CSV와는 달리 tab으로 Data를 구분하는 파일이다.
java 환경에서 DB에 저장하기 위해서는 List 형태로 컨버전하는게 유리하기 때문에 tsv를 List 형태로 바꾸는 기능을 구현해보았다.
관련 라이브러리를 찾아보았으나 마땅한 라이브러리가 없는 듯 했다. csv를 변환해주는 라이브러리가 많은 것과는 대조적이었다. 다행히 tsv데이터 구조는 단순했기 때문에 직접 변화해주는 코드를 구현해보았다.
아래와 같은 tsv 파일이 있다고 가정해보자
name email department
홍길동 hgd@test.com 경영지원팀
임꺽정 lkj@test.com 재무관리팀
김명자 kmj@test.com 총무팀
그리고 java로 아래와 같이 구현했다.
@Test
@DisplayName("tsv To list")
void tsvToList(){
List<Map<String, Object>> list = new ArrayList<>();
try(BufferedReader tsvReader = Files.newBufferedReader(Paths.get("C:\\tsv_test\\sample.tsv")
, StandardCharsets.UTF_8)){
String line;
String[] header = new String[0];
String[] body;
boolean headerCheck = true;
while ((line = tsvReader.readLine()) != null) {
if(headerCheck){
header = line.split("\t");
//log.info("header : {}", Arrays.toString(header));
headerCheck = false;
}else{
body = line.split("\t");
Map<String, Object> mBody = new HashMap<>();
for(int i=0; i<header.length;i++){
mBody.put(header[i], body[i]);
}
list.add(mBody);
}
}
}catch(IOException e){
log.error(e.getMessage());
}
//list foreach
list.forEach(map -> log.info(map.toString()));
}
BufferedReader 객체를 이용해서 라인 단위로 파일의 내용을 읽는다.
첫번째 행은 header 영역임으로 header항목을 추출하고 그 다음부터는 body영역을 추출시 header 항목과 매칭하여 Map에 담고 List에 추가한다. 그러면 아래처럼 List로 컨버전이 된다.
10:33:32.020 [Test worker] INFO com.xxxxxx.xxx.TsvToObjectTest - {name=홍길동, department=경영지원팀, email=hgd@test.com}
10:33:32.027 [Test worker] INFO com.xxxxxx.xxx.TsvToObjectTest - {name=임꺽정, department=재무관리팀, email=lkj@test.com}
10:33:32.027 [Test worker] INFO com.xxxxxx.xxx.TsvToObjectTest - {name=김명자, department=총무팀, email=kmj@test.com}