Skip to content

Instantly share code, notes, and snippets.

@tgmarinho
Created July 18, 2024 21:58
Show Gist options
  • Save tgmarinho/b0dd72e198b12429593f975f7c7efe7a to your computer and use it in GitHub Desktop.
Save tgmarinho/b0dd72e198b12429593f975f7c7efe7a to your computer and use it in GitHub Desktop.
import-lgnd-csv
We can make this file beautiful and searchable if this error is corrected: It looks like row 10 should actually have 1 column, instead of 2. in line 9.
const fs = require('fs');
const csv = require('csv-parser');
const { PrismaClient } = require('@prisma/client');
const moment = require('moment');
const prisma = new PrismaClient();
async function importCSV(filePath) {
const pessoas = [];
fs.createReadStream(filePath)
.pipe(csv({ separator: '\t' }))
.on('data', (row) => {
pessoas.push({
cpf: row['CPF'],
nome: row['Nome Completo'],
rg: row['RG'],
orgaoExpedidor: row['ÓRGÃO EXPEDITOR'],
dataNascimento: moment(row['DATA DE NASCIMENTO'], 'DD/MM/YYYY').toDate(),
estadoCivil: row['ESTADO CIVIL'],
celular: row['CELULAR'],
email: row['EMAIL'],
cep: row['CEP'],
rua: row['RUA'],
ruaNumero: row['NÚMERO'],
ruaComplemento: row['COMPLEMENTO'],
bairro: row['BAIRRO'],
cidade: row['CIDADE'],
estado: row['ESTADO'],
peso: parseFloat(row['PESO (APENAS NUMEROS)']),
altura: parseFloat(row['ALTURA (APENAS NÚMERO)']),
temFilhos: row['TEM FILHOS?'] === 'Sim',
qtdFilhos: parseInt(row['SE TIVER FILHOS, QUANTOS?']) || null,
nomeContatoEmergencia: row['NOME DO CONTATO DE EMERGÊNCIA'],
emailContatoEmergencia: row['E-MAIL DO CONTATO DE EMERGÊNCIA'],
celularContatoEmergencia: row['CELULAR DO CONTATO DE EMERGÊNCIA'],
tipoVinculoContatoEmergencia: row['VÍNCULO CONTATO DE EMEGÊNCIA'],
igreja: row['Nome da sua igreja/comunidade?'],
igrejaPastor: row['Nome do seu pastor/padre/lider?'],
comoConheceuLegendarios: row['Como soube dos Legendários?'],
possuiPlanoSaude: row['Possui Plano de Saúde?'] === 'Sim',
nomePlanoSaude: row['Se sim, qual o nome do plano de saúde?'],
possuiAlergia: row['Alergias?'] === 'Sim',
possuiDiabetes: row['Diabetes?'] === 'Sim',
possuiConvulsoes: row['Convulsões'] === 'Sim',
possuiDesmaios: row['Episódios de desmaio?'] === 'Sim',
possuiProblemasCardiacos: row['Problemas cardíacos?'] === 'Sim',
possuiDisturbiosAlimentares: row['Transtornos alimentares ou problemas estomacais?'] === 'Sim',
possuiProblemasRespiratorios: row['Problemas respiratórios como asma, enfisema, DPOC?'] === 'Sim',
cuidadosPsiquiatricos: row['Cuidados psiquiátricos?'] === 'Sim',
medicacaoDepressao: row['Faz uso de medicamentos para depressão ou problemas de comportamento?'] === 'Sim',
possuiProblemasMusculoesqueleticos: row['Transtornos músculo-esquelético (artrodese, lesões na coluna, etc)?'] === 'Sim',
doencaOuCondicao: row['Se você respondeu SIM a alguma das perguntas anteriores, explique qual é a doença e/ou condição:'],
medicacoes: row['Faz uso de qualquer medicação atualmente (indique)'],
outrasInformacoesMedicas: row['Detalhe qualquer outra informação médica importante que a equipe organizadora deva saber durante a sua estadia no evento de LEGENDÁRIOS:'],
motivosDietaEspecial: row['Por razões médicas requer uma dieta especial? (descreva):'],
tamanhoFarda: row['TAMANHO DA CAMISA'],
aceitaTermos: row['ACEITA TERMOS E CONDIÇÕES'] === 'Sim',
pagamento_status: row['Informe como está a questão do pagamento, já pagou? se sim envie o comprovante, se precisa pagar solicite o link de pagamento para nós'],
});
})
.on('end', async () => {
console.log('CSV file successfully processed');
for (const pessoa of pessoas) {
await prisma.pessoa.create({
data: pessoa,
});
}
console.log('All data imported successfully');
prisma.$disconnect();
});
}
importCSV('path_to_your_csv_file.csv');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment