2013-01-14 50 views
1

我有一个平面文件,其中数据存储在基于位置的格式中。从1至5 - 一些X值被存储,从6至13 - 一些ý值被存储,从14至18 - 一些ž值存储等.. 我需要解析文件并获取这些值并填充一个bean。解析Java中的平面文件

谁能告诉我,我可以去了解它的最佳方式是指我怎么能解析file.I正在使用Java 6

+3

你到底在哪一步?逐行读取文件,使用例如'BufferedReader#readLine()'或者使用例如'#串子()'?这是相当简单的方法。它们已经在Oracle的基本Java教程中提到。 – BalusC

+2

如果遇到问题,您应该先尝试一下自己,然后返回一个更具体的问题。 –

+0

您可以使用['java.util.Scanner'](http://docs.oracle.com/javase/6/docs/api/java/util/Scanner.html)读取平面文件的每一行。如果存在将数据分开的模式(如管道(|)或逗号(,)),则可以使用['String#split'](http://docs.oracle.com/javase/6/docs/api /java/lang/String.html#split%28java.lang.String%29)分离数据并分发它,如果这不是你的情况,你可以使用['String#substring'](http:// docs。 oracle.com/javase/6/docs/api/java/lang/String.html#substring%28int,%20int%29)部分分割数据。 –

回答

3

不复杂的,固定长度的行应该是普通的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; 
+0

它支持oneToMany吗? – gpa

+0

非常有趣,谢谢。 – GarouDan

+0

@gpa是的,有一个OneToMany注释,你有全面的文档在这里:http://camel.apache.org/bindy –