[JAVA] Convert csv file to fixed length record file using enum

I haven't used enum so much, so I made it in practice. Practicality is unknown. The java version is 6.

·Source

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 {

	//Record definition: number of characters
	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;
		}
	}

	//Record definition:(Default character,padding character)
	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 class
	 */
	public static void main(String[] args) throws IOException {
		SamleFixedLengthFromCsv proc = new SamleFixedLengthFromCsv();
		proc.execute();
	}

	/**
	 *Run
	 */
	protected void execute() {
		try {
			mainProc();
		} catch (Exception e) {
			System.out.println("File output failed ...");
		}
	}

	/**
	 *Main process
	 */
	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();
			}
		}
	}


	/**
	 *Fixed-length record creation
	 */
	private String createFixedRecords() {
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < recordVal.values().length; i++) {
			sb.append(createFixedColumn(i));
		}
		return sb.toString();
	}

	/**
	 *Convert items to fixed length
	 */
	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);
			}
		}

		//Numbers are right-justified, otherwise left-justified
		try {
			Integer.parseInt(val.toString());
			return tempPad.append(val).toString();
		} catch(Exception e) {
			return val.append(tempPad.toString()).toString();
		}
	}
}

·Execution result

before

test.csv(Source file)


"1","Battleship","Kongo","JPN"
"2","Heavy cruiser","Takao","JPN"
"3","Destroyer","Shigure","JPN"

after

test.csv(Source file)


00000001 Battleship, Kongo, Kongo, JPN, Battleship, Kongo-class battleship, Kongo-class battleship, Kongo-class battleship, Kongo-class battleship, Kongo-class battleship, JPN
00000002 Heavy cruiser, Takao, JPN
00000003 Destroyer, Shigure, JPN, Destroyer, Shigure, Shigure, JPN

I want to get used to using enums more and more.

Recommended Posts

Convert csv file to fixed length record file using enum
[Ruby] How to convert CSV file to Yaml (Yml)
[Java] Convert DB code to code value using enum
Convert alphabet to 26 base + array length
How to convert erb file to haml
Convert request parameter to Enum in Spring
[Rails] How to handle data using enum
Write to a file using ShiftJIS-Read a file (Kotlin / JVM)
[Spring Batch] Output table data to CSV file