Как печатать только определенные разделы строки?

Прежде всего, пожалуйста, простите мне документ excel: имя | ID | Примечания -------------------- Комплект | 5 | Отличное животное! Ха-ха! Найдено на 1234 восток | | ул. Невероятно уродливый. --------------------- Kat | 2 | Вау, какой заклинатель. от местоположения 3456 | | Сумерки. , , потому что я любительница 1234 восточной улицы, 3456 Dusk Road, ...

Для проекта я беру файл excel в качестве ввода, содержащего список котят, и я хочу вывести адреса, в которых были найдены эти котята.

Я реализовал код так, чтобы котенок был объектом с именем, идентификатором и заметками (котенку были присвоены эти атрибуты от оценки каждой ячейки в документе excel). Раздел примечаний содержит информацию о том, где был найден котенок.

 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() +"
" +);
            }

            wb.close();

        }
        catch(Exception e) { 
            e.printStackTrace();
        }
     }
 }



public class PrintOut {
    public static void main(String[] args) throws FileNotFoundException {
        ReadExcel addresses = new ReadExcel();
        addresses.printer();
    }
}

Все, что я мог найти в Интернете, это о строках и т. Д., Но я не уверен, как начать думать об извлечении определенных фраз из длинной разнообразной строки. Есть ли способ записать информацию по ключевому слову, например «Найденный» или «из местоположения», а затем остановить в определенный период времени,

Было бы проще не конвертировать каждый адрес в одну длинную строку, а вместо этого распечатывать извлеченный адрес для каждого котенка?

Мой код (для справки):

.

INPUT: файл excel с информацией о котенке. Распечатывает раздел «Примечания» для каждого котенка

!

java,excel,string,text-extraction,

1

Ответов: 2


0

Предположим, у вас есть список слов, которые дадут вам начало адреса (практически у него не будет так много возможностей, но давайте представим его, поскольку вы предполагаете, что это будет работать в вашем OP).

Строка, в которой вы выполняете поиск, начинается с некоторых символов, затем либо «найденная», либо «из местоположения», и она заканчивается на следующем , . !или ?символе. Наконец, последняя часть будет содержать некоторые другие символы.

Решение, которое вы должны использовать здесь, это Regex, а также лучший инструмент для сопоставления шаблонов, который вы можете найти. Регулярное выражение для шаблона, описанного выше, будет:

^.*?(found at|from location) (.*?)([.,!?].*+|)$

Это регулярное выражение не так просто, поэтому мы не можем вдаваться в подробности, я бы лучше связал вас с каким-то визуальным инструментом для этого регулярного выражения: https://regex101.com/r/q1w428/1

Итак, как использовать его в java-приложении?

  private static final String KITTEN_PATTERN_STRING = "^.*?(found at|from location) (.*?)([\.,!?].*+|)$";

  private static final Pattern KITTEN_PATTERN = Pattern.compile(KITTEN_PATTERN_STRING);

  public String extractKittenAddress(String kittenString) {
       Matcher m = KITTEN_PATTERN.matcher(kittenString);

       if(m.matches()) 
          return m.group(2);
       return null;

  }

И вот ты!


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() +"
" +);
            }

            wb.close();

        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}
Java, первенствует, строка, текст-экстракция,