1,105,402 Community Members

How to extract data using StringTokenizer ?

Member Avatar
djmonster
Newbie Poster
7 posts since Oct 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Hello,
I have a Java homework that I need to extract the data from ASCII Text file. Here is the ASCII text file http://weather.noaa.gov/data/nsd_bbsss.txt
72;211;KTPA;TAMPA INTERNATIONAL AIRPORT ;FL;United States;4;27-58N;082-32W;27-58-04N;082-31-33W;8;11;
72;212;KCTY;CROSS CITY AIRPORT;FL;United States;4;29-38N;083-06W;29-37-49N;083-06-31W;13;12;
72;213;KAYS;Waycross / Ware County, Ga;GA;United States;4;31-15N;082-24W;31-15N;082-24W;46;46;P
72;214;KTLH;TALLAHASSEE REGIONAL AIRPORT ;FL;United States;4;30-24N;84-21W;30-23-46N;084-21-20W;25;16;
72;215;----;Peachtree City, Ga.;GA;United States;4;33-22N;084-34W;33-22N;084-34W;262;244;
I need to extract only stations that locate in the UNited State only and unique station id. If the Station ID is ----, it will be skip
RIght now, I can get the Station ID but I need to get the Location, Latitude, and Longitude. Can everyone please help ?
Here is an example output
KTPA TAMPA INTERNATIONAL AIRPORT
Located in : FL
Latitude:27-58N
Longitude:082-32W
KCTY CROSS CITY AIRPORT
......
Here is my code that Im working so far

import java.util.Scanner; 
import java.io.*;         
import java.util.StringTokenizer;
 public class a19006
{
   public static void main (String[] args) throws IOException
   {
      String strPage;
      String strData;
      String strLine;
      Scanner myInputFile;
      int x;
      
      String LinkURL = "http://weather.noaa.gov/data/nsd_bbsss.txt";
     
      Inet net = new Inet();
      strPage = net.getURLRaw(LinkURL); 
          
      PrintWriter myOutputFile = new PrintWriter("INFORMATION.TXT");
      myOutputFile.println(strPage);
      myOutputFile.close();
      myInputFile = new Scanner(new File("INFORMATION.TXT"));
      
      for (x=0; x<8500; x++)
      {
         myInputFile.nextLine();
      }

      PrintWriter OutputFile = new PrintWriter("OUTPUT.txt");
      while (myInputFile.hasNext())
         {
            strLine = myInputFile.nextLine();
            
            StringTokenizer strTokenizer = new StringTokenizer(strLine, ";");
            
            while (strTokenizer.hasMoreTokens())
            {
               String str = strTokenizer.nextToken();
               if (str.startsWith("K") && str.length() == 4)
                  {
                  OutputFile.println(str);
                  
                  } 
            }   

         }
      OutputFile.close();
      myInputFile.close();     
   }
   
}
Member Avatar
masijade
Industrious Poster
4,165 posts since Feb 2006
Reputation Points: 1,351 [?]
Q&As Helped to Solve: 510 [?]
Skill Endorsements: 22 [?]
Team Colleague
Featured
 
0
 

Uhm, don't. StringTokenizer is all but deprecated due to a few well known issues. Use a Scanner or a BufferedReader and String's split method.

Member Avatar
djmonster
Newbie Poster
7 posts since Oct 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Uhm, don't. StringTokenizer is all but deprecated due to a few well known issues. Use a Scanner or a BufferedReader and String's split method.

Hey I trynna use the String's split method to extract the data but look like it just the same as StringTokenizer. I have a OUTPUT.txt file that contain a list look like this
72
201
KEYW
KEY WEST INTERNATIONAL AIRPORT
FL
United States
4
24-33N
81-46W
24-33-11N
081-45-24W
Do u have any idea how can I only get the StationID, Name, Location, Latitude and Longtitude like these below.
KEYW
KEY WEST INTERNATIONAL AIRPORT
FL
24-33N
81-46W

Member Avatar
hiddepolen
Posting Whiz in Training
293 posts since Oct 2010
Reputation Points: 32 [?]
Q&As Helped to Solve: 36 [?]
Skill Endorsements: 1 [?]
 
0
 

What exactly is wrong with the method you have in your piece of code? It searches for the string that starts with K, and has a length of 4.

What output is the method generating, that is wrong?

Member Avatar
djmonster
Newbie Poster
7 posts since Oct 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

What exactly is wrong with the method you have in your piece of code? It searches for the string that starts with K, and has a length of 4.

What output is the method generating, that is wrong?

Hey thank for reply, I need to extract the StationID, Name, Location, Latitude and Longtitude only
and the code above only generate the StationID. However, I don't know how to get those Name, Location, Latitude and the Longtitude.
For example, the line is
72;211;KTPA;TAMPA INTERNATIONAL AIRPORT ;FL;United States;4;27-58N;082-32W;27-58-04N;082-31-33W;8;11;
I need to get the text in red, so the output will be:
StationID: KTPA
NAME: TAMPA INTERNATIONAL AIRPORT
Location: FL
Latitude: 27-58N
Longitude: 082-32W

Member Avatar
hiddepolen
Posting Whiz in Training
293 posts since Oct 2010
Reputation Points: 32 [?]
Q&As Helped to Solve: 36 [?]
Skill Endorsements: 1 [?]
 
1
 

Aah, I get it.

If the contents of one line are always in the same order, you can use the following:

while (myInputFile.hasNext())
         {
            strLine = myInputFile.nextLine();
            
            StringTokenizer strTokenizer = new StringTokenizer(strLine, ";");
            
StringBuilder output = new StringBuilder();
strTokenizer.nextToken();
strTokenizer.nextToken();
output.append("StationID: " + strTokenizer.nextToken()+"\n");
output.append("Name: " + strTokenizer.nextToken());
output.append("Location: " + strTokenizer.nextToken()+"\n");
strTokenizer.nextToken();
output.append("Latitude: " + strTokenizer.nextToken()+"\n");
output.append("Longitude: " + strTokenizer.nextToken()+"\n");
        
OutputFile.println(output);

         }

I think this is the best way. Try it, maybe there are other options, but I can't think of any better at the moment.

Member Avatar
Taywin
Posting Maven
2,632 posts since Apr 2010
Reputation Points: 134 [?]
Q&As Helped to Solve: 378 [?]
Skill Endorsements: 17 [?]
 
0
 

Watch out if you hard-code your String parsing... If the file contain even an empty line in the middle or something else, it could easily screw up your code. You need to first define how each data you are expecting should look like before you do that type of parsing.

Member Avatar
djmonster
Newbie Poster
7 posts since Oct 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

Hey Thank for helping. I just try ur code and it looking great
However, the output is in 1 line http://img88.imageshack.us/img88/7486/outputtd.jpg
I need to get the output look like this
StationID: KTPA
NAME: TAMPA INTERNATIONAL AIRPORT
Location: FL
Latitude: 27-58N
Longitude: 082-32W
Also, when I insert the strTokenizer.nextToken(); at line 14 to skip one more line, it show error at this line output.append("Longitude: " + strTokenizer.nextToken() + "\n");
Here is what the message shows
Error
Exception in thread "main" java.util.NoSuchElementException
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349)
at a19006.main(a19006.java:57)

Member Avatar
hiddepolen
Posting Whiz in Training
293 posts since Oct 2010
Reputation Points: 32 [?]
Q&As Helped to Solve: 36 [?]
Skill Endorsements: 1 [?]
 
0
 

@Taywin: yes I know, this is bad and dirty. You should probably surround the block with a try/catch, and handle the errors.

@dj: The ' new line' symbol is a problem. You could try like this (actually easier):

while (myInputFile.hasNext())
         {
            strLine = myInputFile.nextLine();
 try{
            StringTokenizer strTokenizer = new StringTokenizer(strLine, ";");
 
strTokenizer.nextToken();
strTokenizer.nextToken();
OutputFile.println("StationID: " + strTokenizer.nextToken());
OutputFile.println("Name: " + strTokenizer.nextToken());
OutputFile.println("Location: " + strTokenizer.nextToken());
strTokenizer.nextToken();
OutputFile.println("Latitude: " + strTokenizer.nextToken());
OutputFile.println("Longitude: " + strTokenizer.nextToken());
 
OutputFile.println(output);
 } catch (NoSuchElementException) {
System.err.println(e.printStackTrace());
}
         }

Still, you have to make sure yourself that the string you use as input is exactly one line long, with the correct number of elements.

Member Avatar
djmonster
Newbie Poster
7 posts since Oct 2011
Reputation Points: 0 [?]
Q&As Helped to Solve: 0 [?]
Skill Endorsements: 0 [?]
 
0
 

I just fixed my code and the message shows error: <identifier> expected
catch (NoSuchElementException)

Member Avatar
hiddepolen
Posting Whiz in Training
293 posts since Oct 2010
Reputation Points: 32 [?]
Q&As Helped to Solve: 36 [?]
Skill Endorsements: 1 [?]
 
0
 

Yeah, I forgot to add an identifier tot the exception. Add 'e' after the exception.
Wasn't that on google? Please think yourself.

You
This article has been dead for over three months: Start a new discussion instead
Post:
Start New Discussion
Tags Related to this Article