Как распечатать только определенные разделы строки? - PullRequest
0 голосов
/ 25 августа 2018

Прежде всего - пожалуйста, прости меня, потому что я любитель.

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

Я реализовал код так, чтобы котенок был объектом с именем, идентификатором и примечаниями (котенку были присвоены эти атрибуты при оценке каждой ячейки в документе 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, ... 

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

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

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

 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;

    }
 }

INPUT: файл 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 голосов
/ 25 августа 2018

Я предположил, что у вас есть строка, содержащая текст и адрес.И ваше слово-разделитель:

Находится в

Таким образом, вы можете разделить текст и извлечь адрес, повторяя ваши данные, как показано ниже:

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();
        }
    }
}
0 голосов
/ 25 августа 2018

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

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

Решением, которое вы должны использовать здесь, является 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;

  }

И вот, пожалуйста!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...