enumあまり使ったことなかったので練習で作ってみました。
実用性は不明です。
javaのバージョンは6。
・ソース
SamleFixedLengthFromCsv.java
package prottype;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import au.com.bytecode.opencsv.CSVReader;
public class SamleFixedLengthFromCsv {
// レコード定義:文字数
enum recordDef {
col01(8), col02(24), col03(24), col04(3);
private int length;
private recordDef(int length) {
this.length = length;
}
public int getLength() {
return this.length;
}
}
// レコード定義:(デフォルト文字,padding文字)
enum recordVal {
col01("0,0"), col02(", "), col03(", "), col04("---,-");
private recordVal(String val) {
this.val = val;
}
private String val;
public void setVal(String val) {
this.val = val;
}
public String getVal() {
return this.val;
}
}
/**
* mainクラス
*/
public static void main(String[] args) throws IOException {
SamleFixedLengthFromCsv proc = new SamleFixedLengthFromCsv();
proc.execute();
}
/**
* 実行
*/
protected void execute() {
try {
mainProc();
} catch (Exception e) {
System.out.println("ファイル出力に失敗・・・。");
}
}
/**
* メインプロセス
*/
public void mainProc() throws Exception {
PrintWriter pw = null;
CSVReader reader = null;
try {
File file = new File("./test.dat");
reader = new CSVReader(new FileReader(new File("./test.csv")));
file.delete();
file.createNewFile();
pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
String[] record;
while ((record = reader.readNext()) != null) {
recordVal.col01.setVal(record[0] + ",0");
recordVal.col02.setVal(record[1]+", ");
recordVal.col03.setVal(record[2]+", ");
recordVal.col04.setVal(record[3]+ ",-");
pw.print(createFixedRecords() + System.getProperty("line.separator") );
}
pw.close();
reader.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (pw != null) {
pw.close();
}
if (reader != null) {
reader.close();
}
}
}
/**
* 固定長レコード作成
*/
private String createFixedRecords() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < recordVal.values().length; i++) {
sb.append(createFixedColumn(i));
}
return sb.toString();
}
/**
* 項目を固定長に変換
*/
private String createFixedColumn(int defNum) {
StringBuilder tempPad = new StringBuilder();
StringBuilder val = new StringBuilder(recordVal.values()[defNum].getVal().split(",")[0]);
StringBuilder pad = new StringBuilder(recordVal.values()[defNum].getVal().split(",")[1]);
if (val.length() < recordDef.values()[defNum].length) {
for (int i = val.length(); i < recordDef.values()[defNum].length; i++) {
tempPad.append(pad);
}
}
// 数値は右詰めそれ以外は左詰め
try {
Integer.parseInt(val.toString());
return tempPad.append(val).toString();
} catch(Exception e) {
return val.append(tempPad.toString()).toString();
}
}
}
・実行結果
before
test.csv(変換元ファイル)
"1","戦艦","金剛","JPN"
"2","重巡洋艦","高雄","JPN"
"3","駆逐艦","時雨","JPN"
after
test.csv(変換元ファイル)
00000001戦艦 金剛 JPN
00000002重巡洋艦 高雄 JPN
00000003駆逐艦 時雨 JPN
enumもどんどん使って慣れたいですね。