Парсинг данных из txt файла в J2ME

В основном я создаю внутреннюю навигационную систему в J2ME. Я поместил данные о местоположении в файл .txt, т.е.

  • Названия локаций и их координаты.
  • Ребра с соответствующими начальным узлом и конечным узлом, а также весом (длиной узла) .

    Я помещаю обе детали в один файл, чтобы пользователям не приходилось загружать несколько файлов, чтобы их карта работала (это может занять много времени и показаться сложным). Итак, что я сделал, так это разделил различные детали, введя сначала имена местоположения и координаты. После этого я отделил этот раздел от следующего раздела, который является краями, нарисовав линию с несколькими подчеркиваниями.

    Теперь проблема, с которой я столкнулся, заключается в разборе различных деталей в отдельные массивы путем настройки команды (при ручном токенизировании входного потока), чтобы проверить, является ли следующий токен подчеркиванием.

  • Если это так (в терминах псевдокода), перейдите к следующей строке в потоке, создайте новый массив и заполните его следующим набором деталей.

    Я нашел некоторое объяснение / код ЗДЕСЬ, который делает что-то подобное, но по-прежнему анализирует в один массив, хотя вручную токенизирует ввод. Есть идеи, что делать? Спасибо

    Пояснение к текстовому файлу
    Текст имеет следующий формат ...

    <--1stSection-->
    / **
    * Первый раздел имеет следующий формат:
    * xCoordinate; yCoordinate; LocationName
    * /

    12; 13; Нью-Йорк
    40; 12; Вашингтон, округ Колумбия
    ...так далее

    _________________________  <--(underscore divider)

    <--2ndSection-->
    / **
    * На самом деле это список смежности, но косвенно предоставляет подробные сведения о краях. * Его в таком виде
    * StartNode / MainReferencePoint; Endnode1; distance2endNode1; Endnode2; distance2endNode2; ... e.t.c
    * /

    Филадельфия; Вашингтон, округ Колумбия; 7; Нью-Йорк; 2
    Нью-Йорк; Флорида; 24; Иллинойс; 71
    ...так далее

  • Структурированный массив Numpy
    Структурированный массив Numpy
    Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
    T - 1Bits: Генерация последовательного массива
    T - 1Bits: Генерация последовательного массива
    По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
    Что такое деструктуризация массива в JavaScript?
    Что такое деструктуризация массива в JavaScript?
    Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
    1
    0
    3 534
    1

    Ответы 1

    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;
        }
    
    }
    

    и где-нибудь на экране приложения:

    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));       
    
    }
    

    получить значения из хеш-таблицы по ключам будет несложно:

    (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")  
    ...
    

    Другие вопросы по теме