首先-请原谅我,因为我是一个业余爱好者。
对于一个项目,我将输入一个包含小猫列表的excel文件作为输入,并且我想输出找到这些小猫的地址。
我已经实现了代码,以便小猫是具有名称,ID和便笺的对象(通过评估excel文档中的每个单元格为小猫分配了这些属性)。注释部分包含有关在哪里发现小猫的信息。
Excel document:
name | ID | Notes
--------------------
Kit | 5 | Great animal! Haha! Found at 1234 east
| | street. Incredibly ugly.
---------------------
Kat | 2 | Wow, what a charmer. from location 3456
| | Dusk road
.
.
.
当前,我的程序将excel文档转换为字符串,并为每只小猫打印整个“注释”部分。我希望它从字符串的其余部分中提取地址(尝试获取尽可能多的地址),因此输出看起来像这样:
1234 east street, 3456 Dusk Road, ...
我在网上只能找到有关String delims等的信息,但是我不确定如何开始考虑从各种各样的字符串中提取特定的短语。有什么方法可以记录某个关键词的信息,例如“ Found at”或“ from location”,然后停一段时间?
不将每个地址转换为一个长字符串会更容易,而是打印出每只小猫的提取地址会更容易吗?
我的代码(供参考):
public class Kitten {
private String name;
private String animalID;
private String addressFound;
public Kitten() {
super();
this.name = name;
this.animalID = animalID;
this.addressFound = addressFound;
}
//getters and setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAnimalID() {
return animalID;
}
public void setAnimalID(String animalID) {
this.animalID = animalID;
}
public String getAddress() {
return addressFound;
}
public void setAddress(String addressFound) {
this.addressFound = addressFound;
}
}
输入:带有小猫信息的excel文件。打印“注释”部分 每只小猫
public class ReadExcel {
public void printer() {
try {
FileInputStream kittenFile = new FileInputStream(new
File("./IntakeNotesSimple.xlsx"));
XSSFWorkbook wb = new XSSFWorkbook(kittenFile);
XSSFSheet sheet = wb.getSheetAt(0);
ArrayList<Kitten> kittenList = new ArrayList<>();
for (int i= sheet.getFirstRowNum() + 1; i<= sheet.getLastRowNum();
i++) {
Kitten k = new Kitten();
Row r = sheet.getRow(i);
for (int j = r.getFirstCellNum(); j<= r.getLastCellNum(); j++)
{
Cell c = r.getCell(j);
if (j==0) {
k.setName(c.getStringCellValue());
}
if (j==1) {
k.setAnimalID(c.getStringCellValue());
}
if (j==2 && (c != null)) {
k.setAddress(c.getStringCellValue());
}
}
kittenList.add(k);
}
for (Kitten kit: kittenList) {
System.out.println(kit.getAddress() +"\n" +);
}
wb.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}
public class PrintOut {
public static void main(String[] args) throws FileNotFoundException {
ReadExcel addresses = new ReadExcel();
addresses.printer();
}
}
答案 0 :(得分:0)
假设您有一个单词列表,它将为您提供地址的开头(实际上,可能没有那么多的可能性,但是让我们想象一下,因为您建议这将在您的OP中起作用)。
您搜索的字符串将以一些字符开头,然后是“找到于”或“从位置开始”,并将在下一个,
.
!
或{{ 1}}个字符。最后,最后一部分将包含其他一些字符。
您应该在此处使用的解决方案是Regex,这是您可以找到的最佳模式匹配工具。上述模式的正则表达式为:
?
此正则表达式不是那么容易,所以我们可能不会详细介绍,我最好将您链接到该正则表达式的一些可视工具:https://regex101.com/r/q1w428/1
那么,现在如何在Java应用程序中使用它?
^.*?(found at|from location) (.*?)([\.,!?].*+|)$
然后就可以了!
答案 1 :(得分:0)
我假设您有一个包含一些文本和地址的字符串。您的分隔符是:
发现于
因此您可以在迭代数据时拆分文本并提取地址,如下所示:
public class Main {
public static void main(String[]args) throws JsonProcessingException {
String textContaintsAddress = "Great animal! Haha! Found at 1234 east street. Incredibly ugly.";
String address[] = textContaintsAddress.split("Found at");
if (address.length > 1) {
System.out.println(address[1].trim());
}else{
System.out.println(textContaintsAddress);;
}
}
}
它打印:
1234 east street. Incredibly ugly.
按如下所示编辑代码:
public class ReadExcel {
public void printer() {
try {
FileInputStream kittenFile = new FileInputStream(new
File("./IntakeNotesSimple.xlsx"));
XSSFWorkbook wb = new XSSFWorkbook(kittenFile);
XSSFSheet sheet = wb.getSheetAt(0);
ArrayList<Kitten> kittenList = new ArrayList<>();
for (int i= sheet.getFirstRowNum() + 1; i<= sheet.getLastRowNum();
i++) {
Kitten k = new Kitten();
Row r = sheet.getRow(i);
for (int j = r.getFirstCellNum(); j<= r.getLastCellNum(); j++)
{
Cell c = r.getCell(j);
if (j==0) {
k.setName(c.getStringCellValue());
}
if (j==1) {
k.setAnimalID(c.getStringCellValue());
}
if (j==2 && (c != null)) {
// here we add the logic
String textContaintsAddress = c.getStringCellValue();
String address[] = textContaintsAddress.split("Found at");
if (address.length > 1) {
k.setAddress(address[1].trim());
}else{
k.setAddress(textContaintsAddress);;
}
}
}
kittenList.add(k);
}
for (Kitten kit: kittenList) {
System.out.println(kit.getAddress() +"\n" +);
}
wb.close();
}
catch(Exception e) {
e.printStackTrace();
}
}
}