如何仅打印字符串的某些部分?

时间:2018-08-24 22:20:26

标签: java excel string text-extraction

首先-请原谅我,因为我是一个业余爱好者。

对于一个项目,我将输入一个包含小猫列表的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();
    }
}

2 个答案:

答案 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();
        }
    }
}