Reputation: 11
I am reading from a csv file of people, starting with their id, name, and date they joined the application. When reading the first row, the first index adds a whitespace to the string. I am unable to remove this whitespace, as I want to parse it to an integer.
File nameOfFile = fileName;
BufferedReader br = null;
String line = "";
String cvsSplitBy = ",";
try {
br = new BufferedReader(new FileReader(nameOfFile));
while ((line = br.readLine()) != null) {
String[] row = line.split(cvsSplitBy);
temp = row[0].trim();
temp.replaceAll("^\\s", "");
// temp.replaceAll(" ", "");
// String.format("%03d", temp);
System.out.println(temp.length() + " " + temp + " " + temp.charAt(0));
age = Integer.parseInt(temp);
name = row[1];
dateJoined = row[2];
}
} catch (FileNotFoundException | ArrayIndexOutOfBoundsException exception) {
System.out.println("File is not found, please try again.");
System.out.println(exception);
}
if (br != null) {
br.close(); //close buffered reader
}
My csv file:
4 John 10/10/2010
5 Charles 24/08/2010
6 Andrew 09/01/2011
The System.out.println(temp.length() + " " + temp + " " + temp.charAt(0)); prints this:
2 4
1 5 5
1 6 6
where this System.out.println(temp.length() + " " + temp + " " + temp.charAt(1)); prints out:
2 4 4
Upvotes: 0
Views: 952
Reputation: 506
Don't reinvent the wheel. I would use the Univocity parser and then map. More info at: https://www.univocity.com/pages/parsers-documentation Something along this (did not test it);
CsvParserSettings settings = new CsvParserSettings();
CsvParser parser = new CsvParser(settings);
List<String[]> allRows = parser.parseAll(new FileReader(yourfile));
List<Person> persons = allRows.stream().map(p->new Person(p[0],p[1],p[2])).collect(Collectors.toList())
In the Person bean I would make specific setMethods, such as:
public void setAge(String age2parse){
try{
this.age = Integer.parse(age2parse.replaceAll("[^\\d.]",""))
}catch(Exception e){
}
}
public void setName(String name2parse){
this.name = name; // You could divide name here, if wanted.
}
public void setDate(String date2parse){
this.date = date2parse // I would parse it and store it as Date object.
}
Finnaly, a constructor in the bean;
public Person(String a, String n, String d){
setAge(a);
setName(n);
setDate(d);
}
To print:
persons.stream().forEachOrdered(p->System.out.println(p.getAge()+" "+p.getName()+" "+p.getDate()))
Note: There is even way to use BeanRowProcessors, which seem to fit well when you have more fields in the bean, so please, check the documentation on Univocity.
Upvotes: 1