Rotina para Importação de Dados TXT/CSV

Pessoal gostaria de uma ajuda para desenvolver um script de importação de um txt/csv.

Eis a estrutura do mesmo:

cod_emp;cp_nome;cpf;cp_nome_cargo;cp_nome_eve;cod_event;sq_cargo;competencia 11606;ADAUTO OLIVEIRA DA SILVA;60645482501;TECNICO DE NIVEL SUPERIOR;PRODUTIVIDADE Cooperado - Coof;268;TECNICO DE NIVEL SUPERIOR;01/03/2017 11606;ADAUTO OLIVEIRA DA SILVA;60645482502;TECNICO DE NIVEL SUPERIOR;ADIC. ATIVIDADES INSALUBRES 20%;283;TECNICO DE NIVEL SUPERIOR;01/03/2017 11606;ADAUTO OLIVEIRA DA SILVA;60645482502;TECNICO DE NIVEL SUPERIOR;TAXA COOPERATIVA - Coof;265;TECNICO DE NIVEL SUPERIOR;01/03/2017 11606;ADAUTO OLIVEIRA DA SILVA;60645482502;TECNICO DE NIVEL SUPERIOR;INSS - Previdencia Social;858;TECNICO DE NIVEL SUPERIOR;01/03/2017 7786;ADELE GABRIELA MELO LIMA;04140055585;ENFERMEIRO(A);PRODUTIVIDADE Cooperado - Coof;268;ENFERMEIRO(A);01/03/2017 7786;ADELE GABRIELA MELO LIMA;04140055585;ENFERMEIRO(A);ADIC. ATIVIDADES INSALUBRES 20%;283;ENFERMEIRO(A);01/03/2017 7786;ADELE GABRIELA MELO LIMA;04140055585;ENFERMEIRO(A);TAXA COOPERATIVA - Coof;265;ENFERMEIRO(A);01/03/2017 7786;ADELE GABRIELA MELO LIMA;04140055585;ENFERMEIRO(A);INSS - Previdencia Social;858;ENFERMEIRO(A);01/03/2017 7786;ADELE GABRIELA MELO LIMA;04140055585;ENFERMEIRO(A);IRRF - Imposto de Renda;857;ENFERMEIRO(A);01/03/2017 10426;ADELMO DE OLIVEIRA LEITE;07985002578;MEDICO(A);PRODUTIVIDADE Cooperado - Coof;268;MEDICO(A);01/03/2017 10426;ADELMO DE OLIVEIRA LEITE;07985002578;MEDICO(A);ADIC. ATIVIDADES INSALUBRES 20%;283;MEDICO(A);01/03/2017 10426;ADELMO DE OLIVEIRA LEITE;07985002578;MEDICO(A);TAXA COOPERATIVA - Coof;265;MEDICO(A);01/03/2017 10426;ADELMO DE OLIVEIRA LEITE;07985002578;MEDICO(A);INSS - Previdencia Social;858;MEDICO(A);01/03/2017 10426;ADELMO DE OLIVEIRA LEITE;07985002578;MEDICO(A);IRRF - Imposto de Renda;857;MEDICO(A);01/03/2017 8236;ADELMO DE OLIVEIRA LEITE FILHO;07805790612;FARMACEUTICO(A);PRODUTIVIDADE Cooperado - Coof;268;FARMACEUTICO(A);01/03/2017 8236;ADELMO DE OLIVEIRA LEITE FILHO;07805790612;FARMACEUTICO(A);ADIC. ATIVIDADES INSALUBRES 20%;283;FARMACEUTICO(A);01/03/2017 8236;ADELMO DE OLIVEIRA LEITE FILHO;07805790612;FARMACEUTICO(A);TAXA COOPERATIVA - Coof;265;FARMACEUTICO(A);01/03/2017 8236;ADELMO DE OLIVEIRA LEITE FILHO;07805790612;FARMACEUTICO(A);INSS - Previdencia Social;858;FARMACEUTICO(A);01/03/2017

Nota-se que é uma linha para cada evento relacionado a um profissional, ou seja os dados cod_emp;cp_nome;cpf;cp_nome_cargo;sq_cargo;competencia, são gravados na principal e cp_nome_eve;cod_event são gravados na filho.

Já estou trabalhando em um código mais estou empacado no problema de pegar a “foreign key” do mestre pra lançar no detalhe:

[code]$arquivo = basename({arquivo});
//echo $arquivo;
$caminho = $this->Ini->path_doc."/".$arquivo;
//$caminho = $_SERVER[‘DOCUMENT_ROOT’] . $this->Ini->path_doc.$arquivo;
//echo $caminho;

// carregar os dados do arquivo
$file = file("$caminho", FILE_IGNORE_NEW_LINES);
// separar o cabeçalho
$head = explode(’;’, array_shift($file));

// separar os dados em um array
foreach ($file as $v) {
$dados[] = array_combine($head, explode(’;’, $v));
}

// separar dados:
foreach ($dados as $v) {
// separa os dados do empregado
if (!isset($separados[$v[‘cp_i_empregados’]])) {
$empregado = $v;
unset($empregado[‘cp_nome_eve’], $empregado[‘cp_i_eventos’]);
$separados[$v[‘cp_i_empregados’]][‘dados-do-empregado’] = $empregado;
}
// separa dos dados do evento
$separados[$v[‘cp_i_empregados’]][‘dados-dos-eventos’][] = [
‘cp_i_eventos’ => $v[‘cp_i_eventos’],
‘cp_nome_eve’ => “’” . $v[‘cp_nome_eve’] . “’”
];
}
// montar as queries para empregados e eventos

foreach ($separados as $k => $v) {
// tratar os dados antes de montar a query de inserção
foreach ($v[‘dados-do-empregado’] as $index => $value) {
// se forem numéricos ou boleanos
if (is_numeric($value) || is_bool($value)) {
// não precisam de aspas
$d[$index] = $value;
// se forem vazios ou nulos
} elseif (is_null($value)) {
// serão = NULL do mysql entre aspas
$d[$index] = ‘NULL’;
// senão forem nenhum dos acima, provavelmente será string:
} else {
// ficará entre aspas e os caracteres especiais serão escapados
//$sqli = “”;
$d[$index] = “’” . mysql_real_escape_string($value) . “’”;
}
}
$v[‘dados-do-empregado’] = $d;
$queries[] = ‘(’ . implode(’, ', $v[‘dados-do-empregado’]) . ‘)’;
foreach ($v[‘dados-dos-eventos’] as $events) {
$e[] = ‘(’ . $k . ‘, ’ . implode(’, ', $events) . ‘)’;
}
}

$query_empregados = ‘insert into producao(’ . implode(’, ', array_keys($empregado)) . ') values ‘. implode(’, ’ . PHP_EOL, $queries) . ‘;’;

$events_queries = ‘insert into producao_coop(fk_emp, cp_i_eventos, cp_nome_eve) values ’ . implode(’, ’ . PHP_EOL, $e) . ‘;’;[/code]

Sugestão: Por que não gravar os dados em uma tabela única e fazer o relacionamento da tabela pai pelos campos dessa tabela gerada?

Tem algum exemplo?

Se estiver usando MySQL, logo após o Insert do Mestre (Pai), você pode recuperar a ID PK dele assim, e usar no próximo Insert:

/* Macro sc_lookup */

// Recupera o Último ID PK - Inserido por sua sessão única no MySQL.

sc_lookup(ultimoID, "
SELECT
LAST_INSERT_ID()
");

$_UltimoID={ultimoID[0][0]};

if (empty($_UltimoID)) {
$_UltimoID=0;
}

Simples: criaria uma tabela com a mesma estrutura da planilha e importaria a planilha para essa tabela. Como essa tabela vai ter todos os campos que são FK, ficaria fácil relacionar com as demais tabelas (PK) para se obter o resultado desejado.