java - 有没有办法使用正则表达式处理包含主标题的文本文件中的数据?
问题描述
下面是文本文件格式结构的片段
Historical Sales for: 12th of October 2019, 11:37 am
PRODUCT NAME QUANTITY
Coke B 5
Historical Sales for: 21st of October 2019, 8:15 pm
PRODUCT NAME QUANTITY
Peanuts 2
我只想处理列标签和行值,但不包括主标题;在这种情况下,历史销售额为:2019 年 10 月 12 日,上午 11:37。
这是我编写的使用正则表达式处理文本的代码(\\b)
StringBuilder temporary = new StringBuilder();
InputStream inputStream = new FileInputStream(new File(FILE_NAME));
BufferedReader readFile = new BufferedReader(new InputStreamReader(inputStream));
String next;
while ((next = readFile.readLine()) != null) {
temporary.append(next).append("\n");
}
next = String.format("%13s", ""); // spacing for column headers
System.out.println(temporary.toString().replaceAll("(\\b)", next));
解决方案
如果您的意图是只打印以下行:
PRODUCT NAME QUANTITY
Chips 2
Coke B 5
和相似之处。我建议您使用 Java 8 流并使用下面的正则表达式来删除不需要的行:
public static void main(String[] args) throws Exception {
String collect = Files.lines(Paths.get("file.txt"))
.filter(line -> !line.matches("^Historical Sales for.*$") && !line.matches("^\\s*$"))
.map(line -> line+="\n")
.collect(Collectors.joining());
System.out.println(collect);
}
这样,您将拥有:
PRODUCT NAME QUANTITY
Chips 2
Coke B 5
PRODUCT NAME QUANTITY
(...)
使用 Streams 的一个优点是.collect()
允许您将字符串直接解析为List
.
如果你想保留你的榜样,你可以这样做:
StringBuilder temporaryData = new StringBuilder();
InputStream inputStream = new FileInputStream(new File("file.txt"));
BufferedReader readFile = new BufferedReader(new InputStreamReader(inputStream));
String next;
while ((next = readFile.readLine()) != null) {
temporaryData.append(next).append("\n");
}
next = String.format("%13s", ""); // spacing for column headers
String formattedString = temporaryData.toString().replaceAll("(\\b{3})", next);
String stringWithoutHeaders = formattedString.replaceAll("^Historical Sales for.*$", "").replaceAll("^\\s*$", "");
System.out.println(stringWithoutHeaders);
推荐阅读
- python - 使用 Python 从 Keycloak 检索用户信息时出现客户端错误
- c++ - 如何让 emacs 编译我的 c++ 代码并在新窗口中运行它?
- javascript - 在 chrome 90 中为 Selenium 拖放获取 JavaScript 错误
- json - JSON.stringify 将数组中的所有对象打印为 [{},{},{}]
- java - 在 JPA Spring Boot 中选择特定列
- python - 如何根据客户要求在 Django 中使用多个存储,如 AWS S3 存储、谷歌云、Azure
- php - 尝试使用 php 将两个图像上传到我的数据库中,但它不起作用
- python - 使用 Python 使用整数的字符串索引的 TypeError
- arrays - 计算设置器不适用于 v-for 循环内的 v-model
- javascript - 如何将 javascript 函数放入基于 React 类的组件中?