Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

improving data extraction from text file in Java

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
    }
}
like image 743
sasklacz Avatar asked Feb 03 '26 09:02

sasklacz


1 Answers

I have CSV file with sample data in this form

That's not a CSV file. That's a "fixed-width formatted" file.

I'm wondering if there are no better/easier/shorter ways of doing this

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 List of beans (like as Book in your case) and a CSV file.

(from a comment) the file is already created and I must keep it in that form. What about regex ?

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(" ", "") by trim() since that's efficienter (the one is regex, the other is just parsing). Replacing Book[] by List<Book> is also a good suggestion, it's more easy to add another book. You can then just do books.add(book). Also see the Collections tutorial.

like image 72
BalusC Avatar answered Feb 04 '26 22:02

BalusC



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!