Parsing data from a txt file in J2ME

Basically I am building an embedded navigation system in J2ME. I have placed the location data in a .txt file i.e.

Place names and coordinates. Edges with corresponding start node and end node, and weight (node ​​length).

I put both parts in the same file, so users don't have to upload multiple files to get them to work on the map (this can get tedious and difficult). So I did this to separate the details from the revaluation by first typing in the location names and coordinates. After that, I split this section from the next section, which is edges, by drawing a line with multiple underscores.

Now the problem I am facing is parsing various details in separate arrays by setting up a command (while manually tokenizing the input stream) to check that the next token is an underscore character.

If so (in pseudocode terms), go to the next line in the stream, create a new array, and populate it with the next set of parts.

I found some explanation / code HERE that does something similar, but still parses into one array, even though it manually tokenizes the input. Any ideas on what to do? Thanks to

Text Text File
The text has the following format ...

<- 1stSection β†’
 / **
  * The first section has the following format
  * xCoordinate; yCoordinate; LocationName
  * /

12; 13; New York
40; 12, Washington DC,
... etc

_________________________ <- (underscore divider)

<- 2ndSection β†’
 / **
  * Actually this is an adjacency list, but indirectly provides "edge" details.
  * Its in this form
  * StartNode / MainReferencePoint; Endnode1; distance2endNode1; Endnode2; distance2endNode2; ... etc
  * /

Philadelphia, Washington, DC, 7, New York, 2
New York, Florida, 24; Illinois, 71
... etc

+1


source to share


1 answer


package filereader;

import java.io.IOException;
import java.io.InputStream;
import java.util.Hashtable;
import java.util.Vector;

public class FileReader {
    String locationSection;
    String edgeSection;
    Vector locations;
    Vector edges;

    public FileReader(String fileName) {
        // read the contents into the string
        InputStream is = getClass().getResourceAsStream(fileName);
        StringBuffer sb = new StringBuffer();
        int ch;
        try {
            while ((ch = is.read()) != -1) {
                sb.append((char) ch);
            }
        } catch (IOException e2) {
            e2.printStackTrace();
        }
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        String text = sb.toString();

        // separate locations and edges
        String separator = "_________________________";

        // read location section, without last end-of-line char
        int endLocationSection = text.indexOf(separator) - 1;
        locationSection = text.substring(0, endLocationSection);

        // read edges section, without end-of-line char after separator
        int startEdgeSection = endLocationSection + separator.length() + 3;
        edgeSection = text.substring(startEdgeSection, text.length());

        // parse locations and edges
        locations = getLocationsVector(locationSection);
        edges = getEdgesVector(edgeSection);
    }

    // parse locations section
    public Vector getLocationsVector(String section) {
        Vector result = new Vector();
        int startLine = 0;
        int endLine = section.indexOf('\n');
        while (endLine != -1) {
            String line = section.substring(startLine, endLine);
            result.addElement(parseLocationsLine(line, ';'));
            startLine = endLine + 1;
            if (endLine == section.length() - 1)
                break;
            endLine = section.indexOf('\n', startLine);
            // if no new line found, read to the end of string
            endLine = (-1 == endLine) ? section.length() - 1 : endLine;
        }
        return result;
    }

    // parse edges section
    public Vector getEdgesVector(String section) {
        Vector result = new Vector();
        int startLine = 0;
        int endLine = section.indexOf('\n');
        while (endLine != -1) {
            String line = section.substring(startLine, endLine - 1);
            result.addElement(parseEdgesLine(line, ';'));
            startLine = endLine + 1;
            if (endLine == section.length() + 1)
                break;
            endLine = section.indexOf('\n', startLine);
            // if no new line found, read to the end of string
            endLine = (-1 == endLine) ? section.length() + 1 : endLine;
        }
        return result;
    }

    // parse locations line
    public Hashtable parseLocationsLine(String value, char splitBy) {
        Hashtable result = new Hashtable();
        int xCEnd = value.indexOf(splitBy);
        int yCEnd = value.indexOf(splitBy, xCEnd + 1);
        result.put("x", value.substring(0, xCEnd));
        result.put("y", value.substring(xCEnd + 1, yCEnd));
        result.put("location", value.substring(yCEnd + 1, 
            value.length() - 1));
        return result;
    }

    // parse edges line
    public Hashtable parseEdgesLine(String value, char splitBy) {
        Hashtable result = new Hashtable();
        int snEnd = value.indexOf(splitBy);
        result.put("startnode", value.substring(0, snEnd));
        int n = 1;
        int start = snEnd + 1;
        int enEnd = value.indexOf(splitBy, snEnd + 1);
        int dstEnd = value.indexOf(splitBy, enEnd + 1);
        while (enEnd != -1 && dstEnd != -1) {
            result.put("endnode" + String.valueOf(n), 
                    value.substring(start, enEnd));
            result.put("distance" + String.valueOf(n), value.substring(
                    enEnd + 1, dstEnd));
            start = dstEnd + 1;
            enEnd = value.indexOf(splitBy, start);
            if (dstEnd == value.length())
                break;
            dstEnd = value.indexOf(splitBy, enEnd + 1);
            // if last endnode-distance pair, read to the end of line
            dstEnd = (-1 == dstEnd) ? value.length() : dstEnd;
            n++;
        }
        return result;
    }

    // getters for locations and edges
    public Vector getLocations() {
        return locations;
    }

    public Vector getEdges() {
        return edges;
    }

}

      

and somewhere on the app screen:

fr = new FileReader("/map.txt");
Vector vct1 = fr.getLocations();
for (int i = 0; i < vct1.size(); i++) {
    Hashtable location = (Hashtable) vct1.elementAt(i);
    Enumeration en = location.keys();
    String fv = "";
    while (en.hasMoreElements()) {
        String key = (String) en.nextElement();
        String value = (String)location.get(key);
        fv = fv + value + "-";
    }
    this.add(new LabelField(fv));       

}
Vector vct2 = fr.getEdges();
for (int i = 0; i < vct2.size(); i++) {
    Hashtable location = (Hashtable) vct2.elementAt(i);
    Enumeration en = location.keys();
    String fv = "";
    while (en.hasMoreElements()) {
        String key = (String) en.nextElement();
        String value = (String)location.get(key);
        fv = fv + value + "-";
    }
    this.add(new LabelField(fv));       

}

      



it will be easy to get the values ​​from the hashtable using the keys:

(String)location.get("x")  
(String)location.get("y")  
(String)location.get("location")  
(String)edge.get("startnode")  
(String)edge.get("endnode1")  
(String)edge.get("distance1")  
(String)edge.get("endnode2")  
(String)edge.get("distance2")  
...

      

+1


source







All Articles