Como juntar linhas em um arquivo texto e criar uma pasta automaticamente no disco

Dado um arquivo texto como descrito abaixo:

MARIA;5;MPOO
MARIA;3;AED
MARIA;5;MPOO
JOÃO;1;IP

Como criar uma lógica para obter um resultado (que agrupe por nomes e disciplina iguais e some as interações), como:
MARIA;10;MPOO
MARIA;3;AED
JOÃO;1;IP

Consegui criar, como no código abaixo, apenas que mostrasse tudo em linhas separadas, mas não estou conseguindo juntar. Esse código pega o nome do aluno, a quantidade de vezes que ele interagiu com uma matéria e qual a matéria.

public class ArquivoInteracao {

//ESSA PASTA NO C: SÓ É CRIADA SE EU FOR LÁ MANUALMENTE E CRIÁ-LA, EXISTE ALGUMA FORMA DELA 
//SER CRIADA AUTOMATICAMENTE?
static java.io.File diretorio = new java.io.File("C:\\Venera");
boolean statusDir = diretorio.mkdir();
public static File arquivo = new File(diretorio, "exibirInteracao.txt");


public ArquivoInteracao() {
    try {
        boolean statusArq = arquivo.createNewFile();

    } catch (IOException e) {
        e.printStackTrace(); 
    } 
}
private static StringBuilder mensagem;

public static List<String> Read(String Caminho) {
    List<String> conteudo = new ArrayList<>();

    try {
        // Files.readAllLines existe a partir do Java 1.7 em diante
        List<String> linhas = Files.readAllLines(arquivo.toPath());

        for (String linha : linhas) {
            conteudo.add(linha);
        }
    } catch (IOException ex) {
        System.out.println("Erro: Não foi possível ler o arquivo!");
    } catch (Exception ex) {
        System.out.println("Erro: Arquivo não encontrado!");
    }

    return conteudo;
}

public static boolean Write(String Texto) {
    try {
        if (!arquivoExiste()) {
            arquivo.createNewFile();
            System.out.println("not");
        }

        System.out.println("Yes");
        FileWriter arq = new FileWriter(arquivo, true);
        PrintWriter gravarArq = new PrintWriter(arq);
        gravarArq.println(Texto);
        gravarArq.close();

        return true;
    } catch (IOException e) {
        System.out.println(e.getMessage());
        return false;
    }
}

public static void salvar(AlunoCliente ac) {
    String print = ControleTelaInicial.nomeAlunoParaInteracao + ";" + ControllerPainel.contInteração + ";" +
            ControleTelaInicial.comboAlunoParaInteracao;
    
     if (ArquivoInteracao.Write(print)) {
            System.out.println("Arquivo salvo com sucesso!");
        } else {
            System.out.println("Erro ao salvar o arquivo!");
        }
}

public static void mostrar(){
    try {
        List<String> linhas = ArquivoInteracao.Read("exibirInteracao.txt");
        mensagem = new StringBuilder();
        
        if (linhas != null && !linhas.isEmpty()) {
            for (int i = 0; i < linhas.size(); i++) {
                //JÁ TENTEI JUNTAR, MAS NÃO CONSEGUI
                String nome = (linhas.get(i).split(";")[0]);
                int qtdeInteracao = Integer.parseInt(linhas.get(i).split(";")[1]);
                String disciplina = (linhas.get(i).split(";")[2]);
                mensagem.append(nome+ "você interagiu"+ qtdeInteracao +"vezes na disciplina de"+ disciplina+"\n");
            }
        }

    } catch (IndexOutOfBoundsException e3) {
        System.out.println("Nada a exibir: " + e3.getMessage());
    }
}

public static boolean arquivoExiste() {
    return arquivo.exists();
}
public static StringBuilder getMensagem() {
    return mensagem;
}
}