Reputation: 381
I have CSV file which contains field names like firstName,LastName,salary,etc.. from this file I want to generate pojo class.there is no datatype information in CSV file so consider all fields are as String type. Is there any way to create pojo class at build time from csv file?
below is CSV file.
employees.csv
empId,firstName,lastName,title,salary
from this I want to generate pojo as below
class employees{
private string empId;
private string firstName;
private string lastName;
private string title;
private string salary;
// getters and setters
.
.
.
//toString() method
}
Upvotes: 1
Views: 6772
Reputation: 381
finally I got solution for this according to requirement I am creating pojo class manually by setting classname,parentDirectory,packageName,and CSV file.it will create .java in specified directory file with fields,setter,getters and toString method.but it will work if only one header row is in file.
code is below
public static void createPojoFromCsvHeader(File csvInputFile,String directoryOfjavaFile,String packageName,String className)
{
try(BufferedReader stream = new BufferedReader(new FileReader(csvInputFile))) {
String packagePath=packageName.replace(".","/");
String javaOutputDirPath=directoryOfjavaFile+"/"+packagePath+"/";
System.out.println("creating directory ->"+javaOutputDirPath);
File f=new File(javaOutputDirPath);
if(f.mkdirs()){
System.out.println("directory :"+javaOutputDirPath+" created succesfully..");
}else{
System.out.println("directory :"+javaOutputDirPath+" already exist..");
}
String javaOutputFilePath=directoryOfjavaFile+"/"+packagePath+"/"+className+".java";
File javaOutPutFile=new File(javaOutputFilePath);
javaOutPutFile.createNewFile();
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(javaOutputFilePath)));
System.out.println("generating class..");
out.println("package "+packageName+";");
out.println("public class " + className + " {");
String line = null;
String[] fields = null;
int rowNum = 0;
while ((line = stream.readLine()) != null) {
if (line.isEmpty() || line.startsWith("#")) {
continue;
} else {
if (fields == null) {
fields = line.split(",");
}
rowNum++;
String[] values = line.split(",");
for (int i = 0; i < fields.length; i++) {
out.println("\t\tprivate String " + fields[i] + " = \""+ StringEscapeUtils.escapeJava(values[i])+ "\";");
}
for (int i = 0; i < fields.length; i++) {
String tempField=StringEscapeUtils.escapeJava(values[i]).substring(0, 1).toUpperCase()+StringEscapeUtils.escapeJava(values[i]).substring(1);
//getter method
out.println("");
out.println("\t\tpublic String get"+tempField+ "(){");
out.println("\t\t\treturn this."+StringEscapeUtils.escapeJava(values[i])+";");
out.println("\t\t}");
//setter method
out.println("\t\tpublic void set"+tempField+"(String "+ StringEscapeUtils.escapeJava(values[i])+"){");
out.println("\t\t\t this."+StringEscapeUtils.escapeJava(values[i])+" = "+ StringEscapeUtils.escapeJava(values[i])+";");
out.println("\t\t}");
}
out.println("");
out.println("// toString() Method");
out.println("\t\t public String toString(){");
StringBuffer buffer=new StringBuffer();
buffer.append("\"{");
for (int i = 0; i < fields.length; i++) {
buffer.append("\\\""+StringEscapeUtils.escapeJava(values[i])+"\\\"=\"+"+StringEscapeUtils.escapeJava(values[i]));
if(i < fields.length-1){
buffer.append("+\",");
}
else{
buffer.append("+\"");
}
}
buffer.append("}\";");
out.println("\t\t\t return "+buffer);
out.println("\t\t}");
}
out.println("}");
out.close();
}
System.out.println("no of lines fetch from csv :"+rowNum);
}catch(IOException e)
{
e.printStackTrace();
}
}
Upvotes: 2
Reputation: 2120
You can use OpenCSV to process your CSV files and use javassist to dynamically create the Java Classes.
There are examples on their respective websites.
I strongly recommend to look into stackoverflow thread - Generate java class from csv file
I hope it helps!
Upvotes: 1