java - 拆分后如何访问每个元素
问题描述
我正在尝试从文本文件中读取并将其分成三个单独的类别。ID、地址和重量。但是,每当我尝试访问地址和权重时,都会出错。有没有人看到问题?
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.*;
class Project1
{
public static void main(String[] args)throws Exception
{
List<String> list = new ArrayList<String>();
List<String> packages = new ArrayList<String>();
List<String> addresses = new ArrayList<String>();
List<String> weights = new ArrayList<String>();
//Provide the file path
File file = new File(args[0]);
//Reads the file
BufferedReader br = new BufferedReader(new FileReader(file));
String str;
while((str = br.readLine()) != null)
{
if(str.trim().length() > 0)
{
//System.out.println(str);
//Splits the string by commas and trims whitespace
String[] result = str.trim().split("\\s*,\\s*", 3);
packages.add(result[0]);
//ERROR: Doesn't know what result[1] or result[2] is.
//addresses.add(result[1]);
//weights.add(result[2]);
System.out.println(result[0]);
//System.out.println(result[1]);
//System.out.println(result[2]);
}
}
for(int i = 0; i < packages.size(); i++)
{
System.out.println(packages.get(i));
}
}
}
这是文本文件(格式是故意的):
,123-ABC-4567, 15 W. 15th St., 50.1
456-BgT-79876, 22 百老汇, 24
QAZ-456-QWER,东 20 街 100 号,50
Q2Z-457-QWER, 200 East 20th Street, 49
678-FGH-9845 ,, 45 第五大道,, 12.2,
678-FGH-9846,45 第五大道,12.2
123-A BC-9999, 46 Foo Bar, 220.0
347-poy-3465, 101 B'way,24
,123-FBC-4567, 15 West 15th St., 50.1
678-FGH-8465 45 第五大道 12.2
解决方案
查看数据中的模式,其中有些行以不需要的逗号开头,有些行有多个逗号作为分隔符,而一行甚至没有任何逗号分隔符而是空格作为分隔符,您将不得不使用处理所有这些的正则表达式行为。您可以使用此正则表达式,它为您的数据完成所有工作并适当地捕获。
([\w- ]+?)[ ,]+([\w .']+)[ ,]+([\d.]+)
这是上述正则表达式的解释,
([\w- ]+?)
- 捕获ID
由单词字符连字符和空格组成的数据并将其放在 group1 中[ ,]+
- 这充当分隔符,它可以是一个或多个空格或逗号([\w .']+)
- 这会捕获address
由单词字符、空格组成的数据并将.
其放在 group2 中[ ,]+
- 再次如上所述的分隔符([\d.]+)
- 这会捕获weight
由数字组成的数据并将.
其放在 group3 中
这是您可以使用的修改后的 Java 代码。我已经删除了你的一些变量声明,你可以根据需要恢复它们。此代码在捕获您想要使用Matcher
对象的方式后打印所有信息。
Pattern p = Pattern.compile("([\\w- ]+?)[ ,]+([\\w .']+)[ ,]+([\\d.]+)");
// Reads the file
try (BufferedReader br = new BufferedReader(new FileReader("data1.txt"))) {
String str;
while ((str = br.readLine()) != null) {
Matcher m = p.matcher(str);
if (m.matches()) {
System.out.println(String.format("Id: %s, Address: %s, Weight: %s",
new Object[] { m.group(1), m.group(2), m.group(3) }));
}
}
}
印刷,
Id: 456-BgT-79876, Address: 22 Broadway, Weight: 24
Id: QAZ-456-QWER, Address: 100 East 20th Street, Weight: 50
Id: Q2Z-457-QWER, Address: 200 East 20th Street, Weight: 49
Id: 678-FGH-9845, Address: 45 5th Ave, Weight: 12.2
Id: 678-FGH-9846, Address: 45 5th Ave, Weight: 12.2
Id: 123-A BC-9999, Address: 46 Foo Bar, Weight: 220.0
Id: 347-poy-3465, Address: 101 B'way, Weight: 24
Id: 678-FGH-8465, Address: 45 5th Ave, Weight: 12.2
让我知道这是否适合您以及您是否有任何疑问。
推荐阅读
- angular - 我无法在角度访问对象的属性
- django - django RQ / rq scheduler - 可以禁用作业超时吗?
- php - 为什么 gmdate($date) 与 DateTimeZone('GMT') 和 setTimestamp() 返回不同的值?
- jenkins - 作业运行时如何在 Ansible 和 Jenkins 之间交互传递值
- java - 无法从 Android Studio 上的定位服务获取坐标
- c++ - 如何在 C++ 中私下延迟命令?
- mysql - 将 docker sql 与客户端连接时出现问题 用户 'User'@'localhost' 的访问被拒绝(使用密码:是)
- java - 删除父实体抛出 org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: 违反参照完整性约束
- go - 坚持单一价值 Kubernetes 和 Golang
- xml - 如何在 Mulesoft 中遍历 xml 文件