I have CSV file with sample data in this form :
220 30 255 0 0 Javascript
200 20 0 255 128 Thinking in java
, where the first column is height, second thickness, next three are rgb values for color and last one is title. All need to be treated as separate variables. I have already written my own solution for this, but I’m wondering if there are no better/easier/shorter ways of doing this. Extracted data will then be used to create Book object, throw every Book into array of books and print it with swing.
Here’s the code :
private static Book[] addBook(Book b, Book[] bookTab){
Book[] tmp = bookTab;
bookTab = new Book[tmp.length+1];
for(int i = 0; i < tmp.length; i++){
bookTab[i] = tmp[i];
}
bookTab[tmp.length] = b;
return bookTab;
}
public static void main(String[] args) {
Book[] books = new Book[0];
try {
BufferedReader file = new BufferedReader(new FileReader("K:\\books.txt"));
String s;
while ((s = file.readLine()) != null) {
int hei, thick, R, G, B;
String tit;
hei = Integer.parseInt(s.substring(0, 3).replaceAll(" ", ""));
thick = Integer.parseInt(s.substring(4, 6).replaceAll(" ", ""));
R = Integer.parseInt(s.substring(10, 13).replaceAll(" ", ""));
G = Integer.parseInt(s.substring(14, 17).replaceAll(" ", ""));
B = Integer.parseInt(s.substring(18, 21).replaceAll(" ", ""));
tit = s.substring(26);
System.out.println(tyt+wys+grb+R+G+B);
books = addBook(new Book(wys, grb, R, G, B, tyt),books);
}
file.close();
} catch (IOException e) {
//do nothing
}
}
That’s not a CSV file. That’s a “fixed-width formatted” file.
Use a real CSV file format. Then parsing/formatting would be easy with lot of available Java CSV API’s. For example OpenCSV. You can even use it to convert between a
Listof beans (like asBookin your case) and a CSV file.Regex would only make things worse, since it’s not in a regular format, but in a fixed format! If you can’t change the format, even not to CSV, then, well, your approach is as far fine. I would only replace
replaceAll(" ", "")bytrim()since that’s efficienter (the one is regex, the other is just parsing). ReplacingBook[]byList<Book>is also a good suggestion, it’s more easy to add another book. You can then just dobooks.add(book). Also see the Collections tutorial.