Insert registros a partir de arquivo texto

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.