Want to win a PS4? Go Premium and enter to win our High-Tech Treats giveaway. Enter to Win

x
?
Solved

How do I catch numbers from a string also containing characters?

Posted on 2009-05-18
8
Medium Priority
?
513 Views
Last Modified: 2012-06-27
I have a HTML file with a table where each row contains some text and some numbers.
I would like to catch just the numbers from each row and put them into pairs of 5.

A number´s format can be 12345-123 and then I would like to just get the first five digits.

Each five digits should be concatenated to a String and then beeing put into the ArrayList.

I have tried and tried but not succeeded yet. I have submitted my code, maybe it can help a little.
String[] parts = str.split("</?td>");   // get the text between the <td> and </td> tags
            char c;
            int calc=0;
            for(int i=1; i< parts.length; i += 2)
            {
                String nr = null;
                for(int j=1; j < parts[i].length(); j++)
                {
                    c = parts[i].charAt(j);
                    if (Character.isDigit(c))
                    {
                        nr += c;      // Concatenate each 5 digits to a string
                        System.out.print(c);
                        calc++;
                        if(calc%5==0)         // Make a new line each 5 digits
                        {
                            list.add(nr);         // Add the string with 5 digits to the list
                            System.out.println();
                            calc = 0;             // Reset the calculator
                        }
                        
                    }
 
                }
            }

Open in new window

0
Comment
Question by:Roxxor
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
  • 2
  • +1
8 Comments
 
LVL 9

Accepted Solution

by:
wellhole earned 600 total points
ID: 24416141
First of all, always start at index 0 for i = 0 and j = 0.

Put the calc declaration, int calc = 0, after nr declaration, String nr = null.

Do not use calc%5 == 0, because index 0 % 5 is 0. Instead, use calc = 4.
0
 
LVL 9

Assisted Solution

by:wellhole
wellhole earned 600 total points
ID: 24416175
Well, here's the changes.... Changed lines are left aligned.
            String[] parts = str.split("</?td>");   // get the text between the <td> and </td> tags
            char c;
for(int i=0; i< parts.length; i += 2)  // ------- Why += 2?
            {
                String nr = null;
int calc=0;
                for(int j=0; j < parts[i].length(); j++)
                {
                    c = parts[i].charAt(j);
                    if (Character.isDigit(c))
                    {
                        nr += c;      // Concatenate each 5 digits to a string
                        System.out.print(c);
                        calc++;
if(calc == 5)         // Make a new line each 5 digits
                        {
                            list.add(nr);         // Add the string with 5 digits to the list
                            System.out.println();
                            calc = 0;             // Reset the calculator
                        }
                        
                    }
 
                }
            }

Open in new window

0
 
LVL 86

Expert Comment

by:CEHJ
ID: 24416506
It's generally not a good idea to reinvent an html parser, particularly with regexes. Use an html parser, of which you can get many more or less high level parsers. For a high level parser where you can simply address the tables, rows and columns as arrays, try HTMLUnit
0
Looking for the Wi-Fi vendor that's right for you?

We know how difficult it can be to evaluate Wi-Fi vendors, so we created this helpful Wi-Fi Buyer's Guide to help you find the Wi-Fi vendor that's right for your business! Download the guide and get started on our checklist today!

 
LVL 1

Author Comment

by:Roxxor
ID: 24416549
Thanks, I have changed my mind a little, I think it´s easyier to pick up the whole number (e.g. 12345-1234)
and put it to the list. The amount of code will be much smaller and easier.

My problem:

I get a StringIndexOutOfBoundsException on the first iteration in the loop, but then it prints out all following numbers correctly. Why do I get the exception?
String s = "abcd 12345-1234 efgh";
System.out.println(s.substring(s.indexOf("-")-5, s.indexOf("-")+5)); // Prints 12345-1234 = works fine
 
String[] parts = str.split("</?td>");  
for(int i=1; i < parts.length; i += 2)
{
       try
       {
                    System.out.println(parts[i].substring(parts[i].indexOf("-")-5, parts[i].indexOf("-")+5));
                }
                catch(StringIndexOutOfBoundsException err){System.out.println(err.getMessage()); err.printStackTrace();;}
}

Open in new window

0
 
LVL 1

Author Comment

by:Roxxor
ID: 24416562
The StackTrace says:

java.lang.StringIndexOutOfBoundsException: String index out of range: -7
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 24416938
If you post your html as an attachment that would probably help
0
 
LVL 92

Assisted Solution

by:objects
objects earned 150 total points
ID: 24417199
use split() to split the number instead of using substring()

String[] numbers = field.split("-");
0
 
LVL 1

Author Comment

by:Roxxor
ID: 24421125
Yes, I am also using the split() method but I do nee using the substring() as well to filter out all characters.

I still get ArrayIndexOutOfBoundsException and now I´m using split:

A <td> tag with this text: "<td>text text text 12345-123 text text text</td>" should only result in 12345-123 with the below code, but then I get the exception (ArrayOutOfBoundException).

I still don´t get what´s wrong.
String s = "abcd 12345-1234 efgh";
System.out.println(s.substring(s.indexOf("-")-5, s.indexOf("-")+5)); // Prints 12345-1234 = works fine
 
String[] parts = str.split("</?td>");  
// each part[index] now contains a row like <td>text 12345-123 text</td>
 
String[] s = null;
for(int i=1; i < parts.length; i += 2)
{
       try
       {
              s = parts[i].split("-");
              String result = s[0].substring(s[0].length()-4) + "-" + s[1].substring(0,3);  
              System.out.println(result); // should print 12345-123
       }
       catch(StringIndexOutOfBoundsException err){System.out.println(err.getMessage()); err.printStackTrace();;}
}

Open in new window

0

Featured Post

Looking for the Wi-Fi vendor that's right for you?

We know how difficult it can be to evaluate Wi-Fi vendors, so we created this helpful Wi-Fi Buyer's Guide to help you find the Wi-Fi vendor that's right for your business! Download the guide and get started on our checklist today!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A bad practice commonly found during an account life cycle is to set its password to an initial, insecure password. The Password Reset Tool was developed to make the password reset process easier and more secure.
This article covers the basics of data encryption, what it is, how it works, and why it's important. If you've ever wondered what goes on when you "encrypt" data, you can look here to build a good foundation for your personal learning.
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

618 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question