Правильно распарсить файл

202
01 марта 2018, 12:41

Есть такая программа, которая парсит файл и вытаскивает из нее нужные данные (Вопрос, ответы и категории) и полученные данные выгружает в Excel. Но я не понимаю как сделать так, чтобы в Excel файле вопрос, ответы и категории были на одной строке (т.е. нужно как-то в одном цикле или еще иначе распарсить сразу всю строку что-ли не могу понять). Подскажите пожалуйста как правильнее сделать?

public class MyParser {
    public static ArrayList<Model> list;
    public static void main(String[] args) throws IOException {
        list = new ArrayList<>();
        String fName = "1.txt";
        Path myPath = Paths.get("C:", "files", fName);
        parsing(myPath);
        for (Model m : list) {
            System.out.println(m.getQuestion());
            System.out.println(m.getAcceptedAnswer());
            System.out.println(m.getSuggestedAnswer());
            System.out.println(m.getTags());
        }
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet("Просто лист");
        int rowNum = 0;
        Row row = sheet.createRow(rowNum);
        row.createCell(0).setCellValue("Вопрос");
        row.createCell(1).setCellValue("Правильный_ответ");
        row.createCell(2).setCellValue("Другие_ответы");
        row.createCell(3).setCellValue("Теги");
        for (Model dataModel : list) {
            createSheetHeader(sheet, ++rowNum, dataModel);
        }
        try (FileOutputStream out = new FileOutputStream(new File("C://files/yf.xls"))) {
            workbook.write(out);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    private static void createSheetHeader(HSSFSheet sheet, int rowNum, Model dataModel) {
        Row row = sheet.createRow(rowNum);
        row.createCell(0).setCellValue(dataModel.getQuestion());
        row.createCell(1).setCellValue(dataModel.getAcceptedAnswer());
        row.createCell(2).setCellValue(dataModel.getSuggestedAnswer());
        row.createCell(3).setCellValue(dataModel.getTags());
    }
    public static void parsing(Path filePath) throws IOException {
        BufferedReader in = Files.newBufferedReader(filePath);
        String line;
        while ((line = in.readLine()) != null) {
            Pattern patternQuestion = Pattern.compile("<h1 itemprop=\"name\">(\\w*)");
            Pattern patternAcceptedAnswer = Pattern.compile("<div itemprop=\"acceptedAnswer\"(\\w*)");
            Pattern patternSuggestedAnswer = Pattern.compile("<div itemprop=\"suggestedAnswer\"(\\w*)");
            Pattern patternTags = Pattern.compile("<a class=\"tag\"(\\w*)");
            Matcher matcherQuestion = patternQuestion.matcher(line);
            Matcher matcherAcceptedAnswer = patternAcceptedAnswer.matcher(line);
            Matcher matcherSuggestedAnswer = patternSuggestedAnswer.matcher(line);
            Matcher matcherTags = patternTags.matcher(line);
            String question = "";
            String acceptedAnswer = "";
            String suggestedAnswer = "";
            String tags = "";
            while(matcherQuestion.find()) {
                line = line.trim();
                line = line.replaceAll("<h1 itemprop=\"name\">", "");
                line = line.replaceAll("</h1>", "");
                line = line.replaceAll("\n", "");
                question = line;
                list.add(new Model(question, acceptedAnswer, suggestedAnswer, tags));
            }
            while (matcherAcceptedAnswer.find()) {
                line = line.trim();
                line = line.replaceAll("<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"http://schema.org/Answer\" class=\"one-fourth correct\"><span itemprop=\"text\">", "");
                line = line.replaceAll("</span></div>", "");
                line = line.replaceAll("\n", "");
                acceptedAnswer = line;
                list.add(new Model(question, acceptedAnswer, suggestedAnswer, tags));
            }
            while (matcherSuggestedAnswer.find()) {
                line = line.trim();
                line = line.replaceAll("<div itemprop=\"suggestedAnswer\" itemscope itemtype=\"http://schema.org/Answer\" class=\"one-fourth\"><span itemprop=\"text\">", "");
                line = line.replaceAll("</span></div>", "");
                line = line.replaceAll("\n", "");
                suggestedAnswer = line;
                list.add(new Model(question, acceptedAnswer, suggestedAnswer, tags));
            }
            while (matcherTags.find()) {
                line = line.trim();
                line = line.replaceAll("\n", "");
                tags = line;
                list.add(new Model(question, acceptedAnswer, suggestedAnswer, tags));
            }
        }
    }
}

У меня получается так. Т.е. вопрос на одной строке, ответы на других, теги на других.

Answer 1

Набросал идею изменения функции parsing. Могут быть мелкие огрехи, т.к. при мне нет компилятора.

public static void parsing(Path filePath) throws IOException {
    BufferedReader in = Files.newBufferedReader(filePath);
    String line;
    String question = "";
    String acceptedAnswer = "";
    String suggestedAnswer = "";
    String tags = "";
    String oldQuestion="";
    while ((line = in.readLine()) != null) {
        Pattern patternQuestion = Pattern.compile("<h1 itemprop=\"name\">(\\w*)");
        Pattern patternAcceptedAnswer = Pattern.compile("<div itemprop=\"acceptedAnswer\"(\\w*)");
        Pattern patternSuggestedAnswer = Pattern.compile("<div itemprop=\"suggestedAnswer\"(\\w*)");
        Pattern patternTags = Pattern.compile("<a class=\"tag\"(\\w*)");
        Matcher matcherQuestion = patternQuestion.matcher(line);
        Matcher matcherAcceptedAnswer = patternAcceptedAnswer.matcher(line);
        Matcher matcherSuggestedAnswer = patternSuggestedAnswer.matcher(line);
        Matcher matcherTags = patternTags.matcher(line);
        while(matcherQuestion.find()) {
            line = line.trim();
            line = line.replaceAll("<h1 itemprop=\"name\">", "");
            line = line.replaceAll("</h1>", "");
            line = line.replaceAll("\n", "");
            question = line;
            //инициализируем переменную oldQuestion при появлении первого вопроса
            if(oldQuestion.isEmpty()) oldQuestion=question;
            if(!(question.equals(oldQuestion))){
             //добавляем в список, только когда появляется новый вопрос
             list.add(new Model(oldQuestion, acceptedAnswer, suggestedAnswer, tags));
             oldQuestion=question;
             //очищаем другие переменные переменные
             acceptedAnswer = "";
             suggestedAnswer = "";
             tags = "";
            }
        }
        while (matcherAcceptedAnswer.find()) {
            line = line.trim();
            line = line.replaceAll("<div itemprop=\"acceptedAnswer\" itemscope itemtype=\"http://schema.org/Answer\" class=\"one-fourth correct\"><span itemprop=\"text\">", "");
            line = line.replaceAll("</span></div>", "");
            line = line.replaceAll("\n", "");
            acceptedAnswer = line;
        }
        while (matcherSuggestedAnswer.find()) {
            line = line.trim();
            line = line.replaceAll("<div itemprop=\"suggestedAnswer\" itemscope itemtype=\"http://schema.org/Answer\" class=\"one-fourth\"><span itemprop=\"text\">", "");
            line = line.replaceAll("</span></div>", "");
            line = line.replaceAll("\n", "");
            //соединяем другие ответы в одну ячейку, т.к. их несколько
            if(!(suggestedAnswer.isEmpty())){
             suggestedAnswer = suggestedAnswer.concat(",").concat(line);
            }else suggestedAnswer=line;
        }
        while (matcherTags.find()) {
            line = line.trim();
            line = line.replaceAll("\n", "");
            tags = line;
        }
    }
    //добавляем последний вопрос, который не был добавлен
    list.add(new Model(oldQuestion, acceptedAnswer, suggestedAnswer, tags));
}
READ ALSO
Ошибка AudioRecord и запись потока в файл в Android

Ошибка AudioRecord и запись потока в файл в Android

При нажатии кнопки StartRead вылетает с ошибкойВ чем проблема? И еще вопрос, как эти данные из потока записать в музыкальный файл?

164
Вызов glCallList в list compile

Вызов glCallList в list compile

Можно ли вызывать прорисовку скомпилиного листа glCallList между glNewList(list, GL_COMPILE) и glEndList()? Не будет ли ошибка?

169
Динамическое добавление и обработка на js jqeury

Динамическое добавление и обработка на js jqeury

есть обычный див на нём есть спан на который при нажатии добавляется точно такой же блок клик и добавление блока идёт динамически через $('body')on('click','

157
Загрузка странички AJAX-ом

Загрузка странички AJAX-ом

При загрузки странички аяксом

294