【问题标题】:Java Buffered Reader Text File ParsingJava 缓冲阅读器文本文件解析
【发布时间】:2010-02-11 20:59:15
【问题描述】:

我真的很难解析文本文件。我有一个格式如下的文本文件

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

etc 然而,ID 可以表示两个值之一,0 表示它是一个新字段,或 -1 表示它与最后一个新字段相关。相关字段可以自我重复的次数是无限的。问题出在哪里。

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

当我尝试为此编写逻辑代码时,我只会越来越深入地嵌入 while 循环。

我真的很感激任何关于我应该如何去做的建议。提前致谢。

这是我目前的代码。

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

【问题讨论】:

  • 您能否发布您目前正在做的事情(您的代码),以便我们可以根据您当前的策略提出建议,而不是涵盖您已经完成的相同领域?

标签: java text-parsing


【解决方案1】:

也许您应该将地图用于新的花车和相关的花车..如果有您的问题,它应该会有所帮助..示例:

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

【讨论】:

  • 你会在地图中使用浮点数..:)
【解决方案2】:

我假设“字段”表示一个 ID 和可变数量的坐标(浮点数对),从您的代码来看,它实际上代表一个多边形。

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

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

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

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

我认为这将是相当简单的代码。

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

【讨论】:

  • 谢谢我试试你建议的第一种方法,我已经调整了我发布的方法,但花了 10 分钟才到达第 35 栋大楼,似乎已经停在那里了。
  • 我已经实现了这个,但是 java 现在报告我已经用完了堆上的空间,这很不寻常,有什么想法吗?
  • @John--嗯。您要读取的文件有多大?大约。里面有多少个多边形?你能发布你更新的代码吗?
  • 文件中有 135 个多边形,有的超过 50 个点。我现在上传我当前的代码。
  • @John-- 您似乎没有在任何地方初始化 Polygon.isNew。而这个while循环永远不会终止:while(polygons.get(i).isNew == false) newBuilding.cutouts.add(polygons.get(i).coords);
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多