Java Bufferedreader文本文件解析

时间:2010-02-11 20:59:15

标签: java text-parsing

我正在努力解析文本文件。我有一个文本文件,格式如下

ID
Float Float 
Float Float
....   // variable number of floats
END
ID
Float Float 
Float Float
....   
END

等但是ID可以表示两个值中的一个,0表示它是一个新字段,或-1表示它与最后一个新字段相关。相关字段可以重复自我的次数是无限的。这就是问题发生的地方。

因为我在库中有一个方法,它接受新Floats的ArrayList,然后是相关浮点数的ArrayList的ArrayList。

当我尝试为此编写逻辑时,我只是在循环中不断深入嵌入。

我真的很感激有关我应该怎么做的任何建议。提前谢谢。

这是我到目前为止的代码。

BufferedReader br = new BufferedReader(new FileReader(buildingsFile));

        String[] line = br.readLine().trim().split("    ");
        boolean original = true;

        while(true)
        {
            if(line[0].equals("END"))
                break;

            startCoordinate = new Coordinate(Double.parseDouble(line[0]), Double.parseDouble(line[1]));

            while(true)
            {
                line = br.readLine().trim().split("    ");

                if(!line[0].equals("END") && original == true)
                    polypoints.add(new Coordinate(Double.parseDouble(line[0]), Double.parseDouble(line[1])));
                else if(!line[0].equals("END") && original == false)
                    cutout.add(new Coordinate(Double.parseDouble(line[0]), Double.parseDouble(line[1])));
                else if(line[0].equals("END") && original == false)
                {
                    cutouts.add(cutout);
                    cutout.clear();
                }
                else if(line[0].equals("-99999"))
                    original = false;
                else if(line[0].equals("0"))
                    break;
            }

            buildingDB.addBuilding(mapName, startCoord, polypoints, cutouts);
        }

新代码

        int i = 0;

        BufferedReader br = new BufferedReader(new FileReader(buildingsFile));

        String[] line;

        while(true)
        {
            line = br.readLine().trim().split("    ");

            if(line[0].equals("END"))
                break;

            polygons.add(new Polygon(line));

            while(true)
            {
                line = br.readLine().trim().split("    ");

                if(line[0].equals("END"))
                    break;
                polygons.get(i).addCoord(new Coordinate(Double.parseDouble(line[0]), Double.parseDouble(line[1])));
            }



            i++;
        }
        System.out.println(polygons.size());


        int j = 0;
        for(i = 0; i< polygons.size(); i++)
        {
            Building newBuilding = new Building();

            if(polygons.get(i).isNew == true)
            {
                newBuilding = new Building();
                newBuilding.startCoord = new Coordinate(polygons.get(i).x, polygons.get(i).y);
            }

            while(polygons.get(i).isNew == false)
                newBuilding.cutouts.add(polygons.get(i).coords);

            buildings.add(newBuilding);
        }

        for(i = 0; i<buildings.size(); i++)
        {
            System.out.println(i);
            buildingDB.addBuilding(mapName, buildings.get(i).startCoord, buildings.get(i).polypoint, buildings.get(i).cutouts);
        }

3 个答案:

答案 0 :(得分:0)

我假设“字段”表示ID和可变数量的坐标(浮动对),从您的代码判断,实际上表示多边形。

我首先将所有多边形加载到一个单独的Polygon对象中:

class Polygon {
    boolean isNew;
    List<Coordinate> coordinates;
}

并将多边形存储在另一个列表中。然后在第二遍中遍历所有多边形,根据他们的ID将它们分组为类似

class Building {
    Polygon polygon;
    List<Polygon> cutouts;
}

我认为这对代码来说相当简单。

OTOH如果文件中有大量数据,和/或您更喜欢一点一点地处理读取数据,您可以简单地读取多边形及其所有相关切口,直到找到下一个多边形(ID为0),此时你可以简单地将目前读取的东西传递给建筑物DB并开始阅读下一个多边形。

答案 1 :(得分:0)

也许你应该使用map for new floats和相关浮动..如果你的问题应该有帮助......例如:

HashMap hm = new HashMap();
hm.put("Rohit", new Double(3434.34));

答案 2 :(得分:0)

您可以尝试在这里使用ANTLR,语法定义您期望的文本格式,然后您可以将内容包装在Java对象中。 *和+通配符将解决while和for的复杂性。它非常简单易用,你不必构造AST就可以直接从java对象中获取解析后的内容。但唯一的开销是你必须将ANTLR.jar添加到你的路径中。

相关问题