我不会撒谎,我真的不好做正则表达式。我目前正在尝试解析一个文本文件,这给了我很多问题。目的是提取它们各自的“标签/标题”之间的数据。所讨论的文件的布局如下个人信息替换为“数据”:
<STMTTRN><TRNTYPE>POS</TRNTYPE><DTPOSTED>20190717071500</DTPOSTED><TRNAMT>-5.81</TRNAMT><FITID>3893120190717WO</FITID><NAME>DATA</NAME><MEMO>POS Withdrawal</MEMO></STMTTRN>
<STMTTRN><TRNTYPE>DIRECTDEBIT</TRNTYPE><DTPOSTED>20190717085000</DTPOSTED><TRNAMT>-728.11</TRNAMT><FITID>4649920190717WE</FITID><NAME>CHASE CREDIT CRD</NAME><MEMO>DATA</MEMO></STMTTRN>
<STMTTRN><TRNTYPE>ATM</TRNTYPE><DTPOSTED>20190717160900</DTPOSTED><TRNAMT>-201.99</TRNAMT><FITID>6674020190717WA</FITID><NAME>DATA</NAME><MEMO>ATM Withdrawal</MEMO></STMTTRN>
我希望能够以如下所示的多维数组结尾,以便可以将数组的每一行轻松添加到数据库中:Example Parse
正如David已经回答的那样,最好使用Java解析POS输出XML。如果您对正则表达式更感兴趣以获取所有信息,则可以使用此正则表达式。
<[^>]+>|\\n+
您可以在以下站点中进行测试。
我将提出以下方法。
逐行读取文件和文件:
final List<String> lines = Files.readAllLines(Paths.get("/path/to/file"));
此时,您将所有文件行分开,并准备将字符串行转换为更有用的文件。但是您应该事先创建类。
为您的数据创建一个类,类似于:
public class STMTTRN {
private String TRNTYPE;
private String DTPOSTED;
...
...
//constructors
//getters and setters
}
现在,当您在每个单独的字符串中都有一个数据,并拥有一个用于保存数据的类时,可以使用Jackson将行转换为对象:
final XmlMapper xmlMapper = new XmlMapper();
final STMTTRN stmttrn = xmlMapper.readValue(lines[0], STMTTRN.class);
您可能想创建一个循环或使用带有映射器和收集器的流来获取STMTTRN对象的列表:
final List<STMTTRN> stmttrnData = lines.stream().map(this::mapLine).collect(Collectors.toList());
映射器可能在哪里:
private STMTTRN mapLine(final String line) {
final XmlMapper xmlMapper = new XmlMapper();
try {
return xmlMapper.readValue(line, STMTTRN.class);
} catch (IOException e) {
throw new RuntimeException(e);
}
}