将纯文本解析为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);