Ler arquivo csv e salvar na base

Boa tarde pessoal.

Estou desenvolvendo uma aplicação que tem o intuito de ler um arquivo CSV e gravar os dados obtidos na base de dados.

Se trata de um guia médico. Onde o arquivo CSV trás informações do Médico, da especialidade e do convênio que ele atende. Estou trabalhando com 4 tabelas, sendo elas: MEDICO, ESPECIALIDADE, CONVENIO e VINCULO.
A tabela vinculo é responsável por armazenar o vinculo do médico com a especialidade e o convênio que ele atende.

Porém, ao executar a aplicação todos os médicos do arquivo estão recebendo a mesma especialidade e convênio.

Poderiam me ajudar a entender onde estou errando?
O correto seria a aplicação ler a primeira linha do arquivo CSV executar as condições que desenvolvi, salvar no banco e só após esse processo ele ir para próxima linha do arquivo.
Mas após fazer depurar identifiquei que a aplicação percorre todas as linhas do arquivo e só depois ela vai para as validações que desenvolvi.

import { AppDataSource } from './data-source'
import { Umedic } from './entity/Umedic'
import { Umedespec } from './entity/Umedespec';
import { Umedconv } from './entity/Umedconv';
import { Umedvinc } from './entity/Umedvinc';

import { Request, Response, Router } from 'express';
import { Readable } from 'stream';

import * as readline  from 'readline';
import * as multer  from 'multer';

const multerConfig = multer();

const router = Router();

interface Medico {
    idMed: number;
    name: string;
    crm: string;
    doc: string;
    telconsult: string;
    telcel: string;
    email: string;
    tipoprest: string;
    end: string;
    num: string;
    bairro: string;
    cidade: string;
    uf: string;
    cep: string;
    created_at: Date;
    updated_at: Date|null;
}

interface Especialiadade {
    idEspec: number;
    descricaoEspec: string;
}

interface Convenio {
    idConv: number;
    descricaoConv: string;
}

interface ConvenioEspec{
    idVinc: number;
    idEspec: number;
    idConv: number;
    idMed: number;
}

function uid() {
    var min = Math.ceil(1);
    var max = Math.floor(99999);
  return Math.floor(Math.random() * (max - min)) + min;
  };
    
router.post(
    '/medicos',
    multerConfig.single('file'),
    async (request: Request, response: Response) => {
        const { file } = request;

        if( file ) {
            const { buffer } = file;
        
            const readableFile = new Readable();
            readableFile.push(buffer);
            readableFile.push(null);

            const medicoLine = readline.createInterface({
                input: readableFile,
            })

            const medicos: Medico[] = [];
            const especialidade: Especialiadade[] = [];
            const convenio: Convenio[] = [];

            for await (let line of medicoLine) {
                const medicoLineSplit = line.split(';')

                var datual = new Date(Date.now())

                const idm = uid()

                medicos.push({
                    idMed: idm,
                    name: medicoLineSplit[1],
                    crm:  medicoLineSplit[2],
                    doc:  medicoLineSplit[3],
                    telconsult:  medicoLineSplit[4],
                    telcel:  medicoLineSplit[5],
                    email:  medicoLineSplit[6],
                    tipoprest:  medicoLineSplit[7],
                    end:  medicoLineSplit[8],
                    num:  medicoLineSplit[9],
                    bairro:  medicoLineSplit[10],
                    cidade:  medicoLineSplit[11],
                    uf:  medicoLineSplit[12],
                    cep:  medicoLineSplit[13],
                    created_at: datual,
                    updated_at: null,
                });
                
                especialidade.push({
                    idEspec: 1,
                    descricaoEspec: medicoLineSplit[15]
                });

                convenio.push({
                    idConv: 1,
                    descricaoConv: medicoLineSplit[17]
                });
                
                for await ( let { idMed, name, crm, doc, telconsult, telcel, email, tipoprest, end, num, bairro, cidade, uf, cep, created_at, updated_at } of medicos) {
        
                        const medic = new Umedic()
                        medic.idMed = idMed
                        medic.name = name
                        medic.crm = crm
                        medic.doc = doc
                        medic.telconsult = telconsult
                        medic.telcel = telcel
                        medic.email = email
                        medic.tipoprest = tipoprest
                        medic.end = end
                        medic.bairro = bairro
                        medic.num = Number(num)
                        medic.bairro = bairro
                        medic.cidade = cidade
                        medic.uf = uf
                        medic.cep = cep
                        medic.created_at = created_at
                        medic.updated_at = updated_at
    
                        const docMed = doc;
    
                        const medRepo = await AppDataSource.manager
                        .createQueryBuilder(Umedic, "m")
                        .where("m.doc = :cpf", { cpf: docMed })
                        .getOne()
                        
                        const medSearch = new Umedic();
    
                        if(medRepo){
                            console.log('Medic already exists in base: ' + medRepo.idMed)
                            medSearch.idMed = medRepo.idMed
                        }else{
                            await AppDataSource.manager.save(medic)
                            medSearch.idMed = medic.idMed
                            console.log('Saved a new medic with id: ' + medic.idMed)
                        }
    
                        // ESPECIALIDADE
                        var especMed:Umedespec;
                        for await ( let { descricaoEspec } of especialidade){
                            especMed = await AppDataSource.manager
                            .createQueryBuilder(Umedespec, "e")
                            .where("e.descricaoEspec = :descricao", { descricao: descricaoEspec })
                            .getOne()                
                        }
    
    
                        //CONVENIO
                        var convMed:Umedconv;
                        for await ( let { descricaoConv } of convenio){
                            convMed = await AppDataSource.manager
                            .createQueryBuilder(Umedconv, "c")
                            .where("c.descricaoConv = :descricao", { descricao: descricaoConv })
                            .getOne()
                        }
    
                        //VINCULO
                        const vinculoExists = await AppDataSource.manager
                            .createQueryBuilder(Umedvinc, "v")
                            .where("v.idMed = :idMed", { idMed: medSearch.idMed })
                            .andWhere("v.idEspec = :idEspec", { idEspec: especMed.idEspec })
                            .andWhere("v.idConv = :idConv", { idConv: convMed.idConv })
                            .getOne()
                        
                            const idv = uid()
    
                            if(vinculoExists){
                                console.log('This is medic is registered in database with the same information ' + medSearch.idMed)
                            }else{
                                const vinculoMed = new Umedvinc()
                                vinculoMed.idVinc = idv
                                vinculoMed.idMed = medSearch
                                vinculoMed.idConv = convMed
                                vinculoMed.idEspec = especMed
    
                                await AppDataSource.manager.save(vinculoMed)
                            }
                    }

                AppDataSource.initialize().then(async () => {
                        
                })
            }
            
            return response.json(medicos);
        }  
    }
);


export { router };

image