将纯文本解析为Java对象

时间:2014-08-12 10:09:37

标签: java parsing plaintext

我正在解析纯文本并尝试转换为Object。

文字看起来像(我无法更改格式):

"N001";"2014-08-12-07.11.37.352000";"         ";"some@email.com        ";4847       ;"street";"NAME        SURNAME                 ";26  ;"CALIFORNIA                      ";21  

和要转换的对象:

String index;
String timestamp;
String mail;
Integer zipCode
... 

我试过了:

 StringTokenizer st1 = new StringTokenizer(N001\";\"2014-08-12-07.11.37.352000\";\"         \";\"some@email.com        \";4847       ;\"street\";\"NAME        SURNAME                 \";26  ;\"CALIFORNIA                      \";21);

 while(st2.hasMoreTokens()) {
          System.out.println(st2.nextToken(";").replaceAll("\"",""));
        }

输出是正确的,我想有一个计数器并用一个案例bucle进行硬编码并将字段设置为反向计数器,但问题是我有40个字段......

有些想法?

非常感谢!

4 个答案:

答案 0 :(得分:1)

String line = "N001";"2014-08-12-07.11.37.352000";"         ";"some@email.com        ";4847       ;"street";"NAME        SURNAME                 ";26  ;"CALIFORNIA                      ";21  
StringTokenizer st1 = new StringTokenizer(line, ";");

while(st2.hasMoreTokens()) {
    System.out.println(st2.nextToken().replaceAll("\"",""));
}

或者您可以使用split方法并使用分隔符;直接获取值数组

String []values = line.split(";");

然后迭代数组并按照你想要的方式获取和转换值

答案 1 :(得分:0)

无论您解析文件的方式如何,您都需要定义列到字段的映射(以及如何解析文本)。

如果这是一个CVS文件,你可以使用像super-csv这样的库。您需要做的就是编写映射定义。

答案 2 :(得分:0)

我首先根据分号分隔符拆分输入String,然后清理值。

例如:

String input = "\"N001\";\"2014-08-12-07.11.37.352000\";\"         " +
        "\";\"some@email.com        " +
        "\";4847       ;\"street\";\"NAME        " +
        "SURNAME                 \";26  ;\"CALIFORNIA                      " +
        "\";21  ";
// raw split
String[] split = input.split(";");
System.out.printf("Raw: %n%s%n", Arrays.toString(split));
// cleaning up whitespace and double quotes
ArrayList<String> cleanValues = new ArrayList<String>();
for (String s: split) {
    String clean = s.replaceAll("[\\s\"]", "");
    if (!clean.isEmpty()) {
        cleanValues.add(clean);
    }
}
System.out.printf("Clean: %n%s%n", cleanValues);

<强>输出

Raw: 
["N001", "2014-08-12-07.11.37.352000", "         ", "some@email.com        ", 4847       , "street", "NAME        SURNAME                 ", 26  , "CALIFORNIA                      ", 21  ]
Clean: 
[N001, 2014-08-12-07.11.37.352000, some@email.com, 4847, street, NAMESURNAME, 26, CALIFORNIA, 21]

注意

为了将值映射到变量,您需要提前知道它们的索引,并且必须保持一致。

然后,您可以使用get(int i)方法从List中检索它们,例如cleanValues.get(2)会给你发电子邮件等等。

注意(2)

如果你提前知道指数或者它们可能会有所不同,那么你就麻烦了。 你当然可以尝试使用正则表达式来获取这些索引,但我怀疑你可能最终会使你的生活变得复杂。

答案 3 :(得分:0)

您可以使用Java Reflection自动执行流程。

迭代字段

Field[] fields = dummyRow.getClass().getFields();

并设置您的值

SomeClass object =  construct.newInstance();
field.set(object , value);