Дан текстовый файл, каждая строка которого имеет предложенный ниже формат. Необходимо вывести его данные в виде таблицы, и выполнить указанную обработку. Имя файла  задается пользователем. Если выбранный файл имеет иной формат, то сообщить об этом, используя механизм исключений.  
В качестве интерфейса для ввода исходных данных и вывода результатов использовать web-интерфейс организованный с помощью фреймворка Vaadin. Для выбора операции организовать вертикальное меню, для расположения компонентов использовать `GridLayout`, у страницы должен быть заголовок, например, «Лабораторная работа №4» (стиль заголовка выбрать самостоятельно, заголовок поместить в одну из ячеек `GridLayout`).  
Данные из фала считать двумя способами:
1. Стандартное чтение из потока с помощью классов `FileReader` или `Scanner`
2. Чтение из потока в функциональном стиле, используя метод `lines()` класса `Files`
  
Сообщение об исключительной ситуации также отразить на странице.  
Ниже приведен небольшой пример создания таблицы с помощью списка объектов `Person` и вывода некоторой информации о таблице.  
```java
package mypack;

public class Person {  
    String name;  
    String profession;  
    String age;
    public Person(String name, String profession, String age) {
        this.name = name;
        this.profession = profession;
        this.age = age;  
    }

        public String getName() {
        return name;  
    }

    public String getProfession() {
        return profession;  
    }

    public String getAge() {
        return age;  
    }  
  
}
```
  
```java
package org.example;

import java.lang.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Paragraph;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.tabs.Tab;
import com.vaadin.flow.component.tabs.Tabs;
import com.vaadin.flow.router.Route;
import mypack.Person;

@Route
public class MainView extends HorizontalLayout {  
  
// Создаем таблицу, заполняем её данными из списка
    class MyGrid{
        private Grid<Person> grid = new Grid<>(Person.class, false);
        private List<Person> lst=new ArrayList<>();
        MyGrid(){
            grid.addColumn(Person::getName).setHeader("Фамилия").setAutoWidth(true);
            grid.addColumn(Person::getProfession).setHeader("Профессия").setAutoWidth(true);
            grid.addColumn(Person::getAge).setHeader("Возраст").setAutoWidth(true);
            lst.add(new Person("Иванов", "врач", "45"));
            lst.add(new Person("Петров", "водитель", "25"));
            lst.add(new Person("Сидоров", "учитель", "47"));
            lst.add(new Person("Семёнов", "продавец", "35"));
            lst.add(new Person("Крокодилов", "директор", "55"));
            grid.setItems(lst);
            grid.setAllRowsVisible(true);  
        }

        public Grid<Person> getGrid() {
            return grid;  
        }

        public  String toString(){
            return Integer._valueOf_(lst.size()).toString();  
        }  
  
  
    }
    public MainView() {

// Создаем вертикальное меню, связываем каждый пункт меню с компонентом

        Map<Tab, Component> tabsToComponents = new HashMap<>();
        Tab t1 = new Tab("Таблица");
        MyGrid gr=new MyGrid();
        tabsToComponents.put(t1, gr.getGrid());
        Paragraph label = new Paragraph("В таблице "+gr+" строк");
        Tab t2 = new Tab("Кое-что о таблице");
        tabsToComponents.put(t2, label);

        Tabs tabs = new Tabs(t1, t2);
        tabs.setOrientation(Tabs.Orientation._VERTICAL_);
        tabs.setHeight("240px");
        tabs.setWidth("240px");

       // Обрабатываем событие выбор пункта меню
        tabs.addSelectedChangeListener(event -> {
            tabsToComponents.values().forEach(component -> component.setVisible(false));
            tabsToComponents.get(tabs.getSelectedTab()).setVisible(true);  
        });  
        tabsToComponents.values().forEach(component -> component.setVisible(false));  
        tabsToComponents.get(t1).setVisible(true);
       

       // Итоговое добавление компонентов на страницу

       Div pages = new Div(gr.getGrid(), label);
        this.add(tabs, pages);  
  
    }

}
```
**Вариант 9:**  
Школа. Найти суммарную нагрузку всех учителей школы, а также по названию предмета, определить, кто из учителей его преподает.  
Формат строки:  
Фамилия учителя (строка из 20 символов) предмет (строка из 20 символов) количество часов в неделю (целое число).