Alguém sabe como fazer upload de um arquivo texto e usar as linhas (csv) para inserir registros em uma tabela da base?
Criar uma app controle com um campo do tipo Documento(Nome de arquivo)
No evento OnValidate:
$pathFile = $this->Ini->path_doc . "/" . {arquivo};
$arquivo = fopen($pathFile , 'r');
if ($arquivo == false) die('Não foi possível abrir o arquivo.');
while(!feof($arquivo)) {
$linha = fgets($arquivo); //LÊ CADA LINHA
sc_exec_sql("INSERT into tabela VALUES....."); //INSERE CADA LINHA
}
fclose($arquivo);
Sensacional… sintaxe php sem segredo. Estou acostumado a programar em php com Notepd++ e as vezes o ambiente muito “pronto” me congela. Muito obrigado! Vou testar e aviso funcionando.
Ótimo código, Wennys Carlos!!
Obrigada!
Bom dia !
Meu objetivo é importar um arquivo txt para uma tabela no banco sql
No arquivo txt, cada linha seria um insert no banco…
123456 Luis 2014-04-14
estou tentando seguir o exemplo do post:
http://www.scriptcase.com.br/forum/index.php/topic,8129.msg39577.html#msg39577
Porém o código do nosso amigo Wennys Carlos não está funcionando pra mim…
Poderiam me ajudar ?
Bom dia evanzelli,
Eu fiz da seguinte maneira…
Estou importando TODO o arquivo para o SQL.
Porém ao tentar fazer o exemplo acima, demorou muito, pois meu arquivo tem 1.022.115 registros.
Fiz da seguinte maneira.
Criei um aplicação de controle, com um campo do tipo texto. Pedindo o nome do arquivo.
E que o mesmo esteja salvo na pasta /tmp, e que seja extensao .CSV
[code]$caminho_arquivo = “/tmp/” . {arquivo}.".csv";
$arquivo = fopen($caminho_arquivo , ‘r’); //AQUI ABRO O ARQUIVO PARA VER SE ELE EXISTE…
if ($arquivo == false) { // CASO NAO ABRA, MSG DE ERRO.
sc_error_message(‘Não foi possível abrir o arquivo.’);
sc_error_exit();
} else {
fclose($arquivo); //FECHO ARQUIVO SE ABERTO COM SUCESSO
// EXECUTO O COPY, NA TABELA, ESPECIFICANDO OS CAMPOS, NO MEU CASO CAMPO1 É SERIAL
$SQL = “COPY nome_tabela (campo2, campo3, campo4, campo5) FROM '”.$caminho_arquivo."’ DELIMITER ‘;’ CSV;";
sc_exec_sql($SQL);
}[/code]
Veja se ajuda!
Julia
boa tarde
Desde já agradeço muito a sua ajuda.
Segui seus passos, porém apresenta a seguinte mensagem de erro:
ERRO
Undefined variable: arquivo
fopen(/tmp/.csv): failed to open stream: No such file or directory
Não foi possível abrir o arquivo.
meu script ficou assim:
$caminho_arquivo = “/tmp/” . {arquivo}.".csv";
$arquivo = fopen($caminho_arquivo , ‘r’); //AQUI ABRO O ARQUIVO PARA VER SE ELE EXISTE…
if ($arquivo == false) { // CASO NAO ABRA, MSG DE ERRO.
sc_error_message(‘Não foi possível abrir o arquivo.’);
sc_error_exit();
} else {
fclose($arquivo); //FECHO ARQUIVO SE ABERTO COM SUCESSO
// EXECUTO O COPY, NA TABELA, ESPECIFICANDO OS CAMPOS, NO MEU CASO CAMPO1 É SERIAL
$SQL = “INSERT INTO HSOL_COMPARA (Pes_Numero_Cp, He_Cp, Data_Cp) FROM '”.$caminho_arquivo."’ DELIMITER ‘;’ CSV;";
sc_exec_sql($SQL);
}
Obrigado
Evanzelli,
ERRO
Undefined variable: arquivo
fopen(/tmp/.csv): failed to open stream: No such file or directory
Não foi possível abrir o arquivo.
É pq ele está procurando na pasta /tmp o arquivo “.csv” e não existe.
1º cria um campo com o nome “arquivo” na aplicação de controle.
Ex: Nome do arquivo “teste.csv”, salve ele na pasta /tmp
Na app no campo “arquivo”, insira a palavra “teste”, ou nome do seu arquivo. Não precisa colocar a extensão.
Att.
Julia
mais uma vez obrigado pela sua colaboração…
ainda está aparecendo a msm mensagem, poderia me informar:
a pasta é C:\Program Files (x86)\NetMake\v7\wwwroot\scriptcase\tmp ?
dentro do arquivo csv fica em cada coluna os dados que queremos inserir apenas ?
estou achando que o erro pode ser um ou outro,
Muitoooo obrigado
evanzelli, tenta criar um campo com o nome “arquivo”, esse campo é do tipo “Documento (Nome de Arquivo)”.
Coloque o código que a Júlia informou no evento “onValidate”.
Execute e faça o teste com a importação de um arquivo .csv
Quem puder ajudar…
…ainda está dando o mesmo erro acima… já fiz todo o passo do pessoal…
obrigado
ERRO
Undefined variable: arquivo
fopen(/tmp/.csv): failed to open stream: No such file or directory
Não foi possível abrir o arquivo.
O nome do campo que vc criou é arquivo?
isso … campo
O erro é claro, o caminho do arquivo esta errado. Ou ele não esta importando!
Tente fazer assim:
$arquivo=$this->Ini->path_doc."/".{arquivo};
no lugar de:
$caminho_arquivo = “/tmp/” . {arquivo}.".csv";
Caros colegas estou com a mesma necessidade, porem é para .txt o meu ficou assim
No onvalidate ficou assim
$caminho_arquivo = “/tmp/” . {arquivo}.".txt";
$arquivo = fopen($caminho_arquivo , ‘r’); //AQUI ABRO O ARQUIVO PARA VER SE ELE EXISTE…
if ($arquivo == false) { // CASO NAO ABRA, MSG DE ERRO.
sc_error_message(‘Não foi possível abrir o arquivo.’);
sc_error_exit();
} else {
fclose($arquivo); //FECHO ARQUIVO SE ABERTO COM SUCESSO
// EXECUTO O COPY, NA TABELA, ESPECIFICANDO OS CAMPOS, NO MEU CASO CAMPO1 É SERIAL
$SQL = “COPY nome_tabela (campo2, campo3, campo4, campo5) FROM '”.$caminho_arquivo."’ DELIMITER ‘;’ txt;";
sc_exec_sql($SQL);
}
E quando clico no ok da esta mensagem abaixo
ERRO
fopen(/tmp/.txt): failed to open stream: No such file or directory
Não foi possível abrir o arquivo.
caminho: C:\Program Files (x86)\NetMake\v7\wwwroot\scriptcase\tmp\arquivo.txt
Se alguem puder me ajudar desde já agradeço a todos
Com a Ajudo do amigo Fred deu certo eu estava fazendo errado, pois o fato do campo ser criado como documento é para poder escolher o arquivo
no meu codigo leu o arquivo conforme o codigo do Wennys Carlos. porem não consigo inserir no banco me passa este erro:
mssql_query(): message: Invalid column name ‘CPF’. (severity 16)
mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 16)
mssql_query(): message: Invalid column name ‘DatNasci’. (severity 16)
mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 16)
mssql_query(): message: Invalid column name ‘Ntr_de’. (severity 16)
mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 16)
mssql_query(): message: Invalid column name ‘UFNasc’. (severity 16)
mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 16)
mssql_query(): message: Column name or number of supplied values does not match table definition. (severity 16)
mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 16)
mssql_query(): Query failed
Erro ao acessar o banco de dados
Column name or number of supplied values does not match table definition.
{SC_DB_ERROR_INI}View SQL{SC_DB_ERROR_MID}INSERT into form.Cdd VALUES(CPF,DatNasci,Ntr_de,UFNasc){SC_DB_ERROR_CLS}Close{SC_DB_ERROR_END}
fiz assim.
$pathFile = $this->Ini->path_doc . “/” . {arquivo};
$arquivo = fopen($pathFile , ‘r’);
if ($arquivo == false) die(‘Não foi possível abrir o arquivo.’);
while(!feof($arquivo)) {
$linha = fgets($arquivo); //LÊ CADA LINHA
sc_exec_sql("INSERT into Cdd VALUES '".$linha."' "); //INSERE CADA LINHA
}
fclose($arquivo);
leu o arquivo salvo em qualquer lugar do pc, ate entao sem problemas, porem nao inserta no banco e retorna
mssql_query(): message: Incorrect syntax near ‘xxxxxxxx;yyyyyyyyyyyyyyyyyyy’. (severity 15)
mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 15)
mssql_query(): Query failed
Humm interessante…
Só esqueceu de tratar cada variável do .csv
Exemplo
2014-09-16;JOSE TEIXEIRA;10.00
Tem que usar a função ‘Explode’ para separar cada campo.
Teria que ser um Insert assim:
sc_exec_sql("
INSERT
INTO Cdd
(Data,
Nome,
Valor)
VALUES
(’$Data’,
‘$Nome’,
$Valor);
");
Você tem que tratar cada variável antes de montar o INSERT,
faça só uma linha e pegue ela com: echo, ai execute no gerenciador de banco
de dados, se passar esta 100%, para prosseguir com o código PHP.