Sunday, February 13, 2011

What's the best way to have stringTokenizer split up a line of text into predefined variables

I'm not sure if the title is very clear, but basically what I have to do is read a line of text from a file and split it up into 8 different string variables. Each line will have the same 8 chunks in the same order (title, author, price, etc). So for each line of text, I want to end up with 8 strings.

The first problem is that the last two fields in the line may or may not be present, so I need to do something with stringTokenizer.hasMoreTokens, otherwise it will die messily when fields 7 and 8 are not present.

I would ideally like to do it in one while of for loop, but I'm not sure how to tell that loop what the order of the fields is going to be so it can fill all 8 (or 6) strings correctly. Please tell me there's a better way that using 8 nested if statements!

EDIT: The String.split solution seems definitely part of it, so I will use that instead of stringTokenizer. However, I'm still not sure what the best way of feeding the individual strings into the constructor. Would the best way be to have the class expecting an array, and then just do something like this in the constructor:

line[1] = isbn;
line[2] = title;
  • Would a regular expression with capture groups work for you? You can certainly make parts of the expression optional.

    An example line of data or three might be helpful.

    From Ken Gentle
  • Is this a CSV or similar file by any chance? If so, there are libraries to help you, for example Apache Commons CSV (link to alternatives on their page too). It will get you a String[] for each line in the file. Just check the array size to know what optional fields are present.

  • Regular expression is the way. You can convert your incoming String into an array of String using the split method

    http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html#split(java.lang.String)

    From banjollity
  • The best way is to not use a StringTokenizer at all, but use String's split method. It returns an array of Strings, and you can get the length from that.

    For each line in your file you can do the following:

    String[] tokens = line.split("#");
    

    tokens will now have 6 - 8 Strings. Use tokens.length() to find out how many, then create your object from the array.

0 comments:

Post a Comment