Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将纯文本解析为Java对象_Java_Parsing_Plaintext - Fatal编程技术网

将纯文本解析为Java对象

将纯文本解析为Java对象,java,parsing,plaintext,Java,Parsing,Plaintext,我正在解析一个纯文本并试图转换成一个对象 文本看起来像(我无法更改格式): 以及要转换的对象: String index; String timestamp; String mail; Integer zipCode ... 我试过: StringTokenizer st1 = new StringTokenizer(N001\";\"2014-08-12-07.11.37.352000\";\" \";\"some@email.com \";4847

我正在解析一个纯文本并试图转换成一个对象

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

以及要转换的对象:

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("\"",""));
        }
输出是正确的,我想有一个计数器和一个case-bucle硬编码,设置字段depending计数器,但问题是我有40个字段

有什么想法吗

非常感谢

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(";");

然后遍历数组,获取并按您想要的方式转换值

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


如果这是一个CVS文件,您可以使用超级csv之类的库。您只需编写一个映射定义。

我会首先根据分号分隔符拆分您的输入
字符串
,然后清除值

例如:

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);
注意

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

然后,您可以使用
get(int i)
方法从
列表中检索它们,例如
cleanValues。get(2)
将为您获取电子邮件等

注(2)

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

您可以使用自动化流程

在字段上迭代

Field[] fields = dummyRow.getClass().getFields();
设定你的价值观

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

你有什么问题?什么不起作用?问题是我不想对它进行harcode,因为如果类或输入字符串发生变化,用类的40个字段修复它是一个小问题,那么使用
列表来放入项目。最后我必须对它进行harcode,但我喜欢你对列表的想法!dummyRow的类型是什么?我有一个字符串和一个类,叫做MailMail Mail=new Mail()字段[]字段=Mail.getClass().getFields();'这样可以吗?是的,应该是SomeClass.class.getFields();
Field[] fields = dummyRow.getClass().getFields();
SomeClass object =  construct.newInstance();
field.set(object , value);