【问题标题】:Parsing a flat file in Java在 Java 中解析平面文件
【发布时间】:2012-12-28 18:25:03
【问题描述】:

我有一个平面文件,其中数据以基于位置的格式存储例如。从 1 到 5 - 存储一些 x 值,从 6 到 13 - 存储一些 y 值,从 14 到 18 - 一些 z 值被存储等等.. 我需要解析文件并获取这些值并填充一个 bean。

谁能告诉我最好的方法是如何解析文件。我使用的是 Java 6。

【问题讨论】:

  • 你到底卡在哪一步了?使用例如逐行读取文件BufferedReader#readLine() 或使用例如子串String#substring()?不过,这是相当简单的方法。它们已经在 Oracle 的基本 Java 教程中提及。
  • 您应该先自己尝试一下,然后在遇到问题时提出更具体的问题。
  • 您可以使用java.util.Scanner 读取平面文件的每一行。如果存在分隔数据的模式,如竖线 (|) 或逗号 (,),您可以使用 String#split 分隔数据并分发它,如果不是您的情况,您可以使用 String#substring 进行拆分部分数据。

标签: java file-handling


【解决方案1】:

在纯 java 中,非复杂、固定长度的行应该很容易。

你为什么不直接使用简单的基本子字符串?我已经看到它用于解析相当大的平面文件,它并不像听起来那么糟糕。也很容易从中获得概览。

myObject.setX(Integer.parseInt(input.substring(0,4)));
myObject.setY(input.substring(5,12); 
..  

如果您真的很想将几个大型平面文件映射到 java,您可能想要使用一些库。

Smooks 让您在 XML 文件中指定映射,并让 smooks 运行时映射从字段到对象。还有一个用于图形映射的 Eclipse IDE。这个库有点重量级。

我真的很喜欢Apache Camel 中的Bindy 组件。它需要引入消息路由器的开销,但可以注释普通的 java 类,并一次性完成映射和 java 类。

// Like this
@FixedLengthRecord(length=54, paddingChar=' ')
public static class Order {

    @DataField(pos = 1, length=2)
    private int orderNr;

    @DataField(pos = 3, length=2)
    private String clientNr;

【讨论】:

  • 是否支持 oneToMany ?
  • @gpa 是的,有一个 OneToMany 注释,你在这里有综合文档:camel.apache.org/bindy
  • Bindy 看起来真的很酷,遗憾的是没有关于如何在没有 Apache Camel 的情况下使用 Bindy 的明确文档。
  • 是的,好在 Apache Camel 也很酷。
猜你喜欢
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2012-09-04
  • 2011-01-03
相关资源
最近更新 更多