【问题标题】:Parse a plain text into a Java Object将纯文本解析为 Java 对象
【发布时间】:2014-08-12 10:09:37
【问题描述】:

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

文字看起来像(我不能改变格式):

"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 个字段......

有什么想法吗?

非常感谢!

【问题讨论】:

  • 你的问题是什么?什么不起作用?
  • 问题是我不想对它进行硬编码,因为如果类或输入字符串发生变化,用类的 40 个字段来修复它是一个小问题
  • 使用List 将项目放入。

标签: java parsing plaintext


【解决方案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(";");

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我将首先根据分号分隔符拆分您的输入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) 会给你发邮件等。

      注(二)

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

      【讨论】:

      • 最后我要对其进行编码,但我喜欢你对列表的想法!
      【解决方案4】:

      您可以使用Java Reflection 来自动化您的流程。

      遍历字段

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

      并设定你的价值观

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

      【讨论】:

      • dummyRow 的类型是什么?我有一个字符串和一个类,称为邮件。 '邮件mail = new Mail() Field[] fields = mail.getClass().getFields();'这样可以吗?
      • 是的,应该是 SomeClass.class.getFields();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 2016-02-17
      • 2016-12-02
      • 1970-01-01
      相关资源
      最近更新 更多