Есть такая программа, которая парсит файл и вытаскивает из нее нужные данные (Вопрос, ответы и категории) и полученные данные выгружает в 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));
}
}
}
}
У меня получается так. Т.е. вопрос на одной строке, ответы на других, теги на других.
Набросал идею изменения функции 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));
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
При нажатии кнопки StartRead вылетает с ошибкойВ чем проблема? И еще вопрос, как эти данные из потока записать в музыкальный файл?
Можно ли вызывать прорисовку скомпилиного листа glCallList между glNewList(list, GL_COMPILE) и glEndList()? Не будет ли ошибка?
есть обычный див на нём есть спан на который при нажатии добавляется точно такой же блок клик и добавление блока идёт динамически через $('body')on('click','