Jump to content
toarelli

Importar e Ler TXT

Recommended Posts

toarelli

Caros amigos.

Estou com uma dúvida, que recorro ajuda dos amigos.

Como faço para quando importar um ARQUIVO.TXT, o sistema possa ler linha-a-linha e comparar com o Banco de Dados, caso a linha do código no .TXT não for encontrada, não importa.

Abaixo o código que escrevi para importar, funciona.

         <?php

          //Variável Passada da Página Anterior
          $cot_cotIdGet = isset($_GET['cotId']) ? $_GET['cotId'] : false;
          $cot_cotId  = isset($_POST['cotId']) ? $_POST['cotId'] : $cot_cotIdGet;   

          $cotNumeroGet = isset($_GET['cotNumero']) ? $_GET['cotNumero'] : false;
          $cotNumero    = isset($_POST['cotNumero']) ? $_POST['cotNumero'] : $cotNumeroGet;       

            //Função para importar Arquivo
            function Inserir($itens, Pdo $pdo){
                $sts = $pdo->prepare("INSERT INTO cotItens(cotNumImport, codProdClie, cotQtde, cotVerTxt, cotNumero, cot_cotId) VALUES(?,?,?,?,?,?);");  
                $sts->bindValue(1, $itens[0], PDO::PARAM_STR);
                $sts->bindValue(2, $itens[1], PDO::PARAM_STR);        
                $sts->bindValue(3, $itens[2], PDO::PARAM_STR);            
                $sts->bindValue(4, $itens[3], PDO::PARAM_STR);        
                $sts->bindValue(5, $itens[4], PDO::PARAM_STR);          
                $sts->bindValue(6, $itens[5], PDO::PARAM_STR);                                
                $sts->execute();
                $sts->closeCursor();
                $sts = NULL;
            }
			
			
            if (!empty($_FILES['arquivo'])) {

                $Pdo  = new PDO("mysql:host=localhost; dbname=lojaweb", "root", "");
				
                $file = fopen($_FILES['arquivo']['tmp_name'], 'r');

                while (!feof($file)){
                    $linha = fgets($file);          
                    $itens = explode(';', $linha);   
                    $itens[] = '1';     
                    $itens[] = $cotNumero;                
                    $itens[] = $cot_cotId;                                  
                    Inserir($itens, $Pdo);
                }

                    echo '<div class="alert alert-info alert-dismissible">        
                              <h4>Arquivo Importado com Sucesso!</h4>            
                          </div>';  

                  //Redirecionando para Caixa de Importar Arquivo do Cliente
                  echo '<meta http-equiv="refresh" content="3, URL=painel.php?exe=loja/importar_itensCot&cotNumero='.$cotNumero.'"" />';

            }
?>

 

Grato,

 

Toarelli

Edited by toarelli

Share this post


Link to post
Share on other sites
M6

Na tua função "inserir" fazes um select count pela chave da tabela (ou campos que sejam relevantes) e vez se essa contagem te retorna 0 ou mais registos.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
toarelli
Em 20/04/2018 às 05:42, M6 disse:

Na tua função "inserir" fazes um select count pela chave da tabela (ou campos que sejam relevantes) e vez se essa contagem te retorna 0 ou mais registos.

Caro M6

 

Como faria isso, esse é meu problema ?

Share this post


Link to post
Share on other sites
toarelli

olá amigos.

tentei fazer desta forma abaixo, em partes deu certo.

o sistema lê linha-a-linha e quando encontra encerra. O problema é que lê e grava até chegar na linha que não existe.

como faço para ler primeiro, comparar e se depois estiver tudo correto grava no banco de dados.

abaixo o código que usei:

<?php
session_start();

//Incluir a conexao com BD
include_once("conexao.php");

//Receber os dados do formulário
$arquivo_tmp = $_FILES['arquivo']['tmp_name'];

//ler todo o arquivo .TXT para um array
$dados = file($arquivo_tmp);

//Variável criada apenas para Comparar linha-a-linha
$number = "123057";

foreach($dados as $linha){
	$linha = trim($linha);
	$valor = explode(',', $linha);
	echo '<pre>';
	var_dump($valor);
	echo '</pre>';
	
	$nome = $valor[0];
	$email = $valor[1];
	$usuario = $valor[2];
	$senha = $valor[3];
	
   //Aqui faço a leitura das linhas
	if($senha == $number){	
		echo '<pre>';
		var_dump($linha);
		echo "Não Importado";
		exit;
		echo '</pre>';	  
	  
    } else {		
	
    //Insert no Banco de Dados
	$result_usuario = "INSERT INTO usuarios (nome, email, usuario, senha) VALUES ('$nome', '$email', '$usuario', '$senha')";
	$resultado_usuario = mysqli_query($conn, $result_usuario);	
	
	}
}

$_SESSION['msg'] = "<p style='color: green;'>Carregado os dados com sucesso!</p>";

header("Location: index.php");

 

O arquivo texto está assim:

Beltrano, beltrano@celta.com.br, beltra, 123056
Ciclano, ciclano@celta.com.br, cicla, 123057
Fulano, fulano@celta.com.br, fulan, 123058

 

Como faço para ler tudo antes e só depois gravar ?

Grato

Toarelli

Share this post


Link to post
Share on other sites
M6

Fazes dois ciclos.

Um em que apenas lês a informação, por exemplo para um array, e depois outro onde fazes o loop pelo array e fazes o insert.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

duas perguntas :

- a tua base de dados é mysql ?

- pretendes actualizar o registo caso este já exista ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
toarelli
7 horas atrás, HappyHippyHippo disse:

duas perguntas :

- a tua base de dados é mysql ?

- pretendes actualizar o registo caso este já exista ?

 

Caro amigo

- a tua base de dados é mysql ? resposta: SIM estou usando MySql

- pretendes actualizar o registo caso este já exista ? resposta: NÃO cada vez que Importar um arquivo é sempre uma Nova Importação.

 

A cotação n.1001 - tem uma importação exclusiva

A cotação n.5010 - tem uma importação exclusiva

 

Apenas preciso comparar todos os campos por exemplo: o CÓDIGO no TXT é igual a do SISTEMA ==> IMPORTA.

Se algum código no TXT não for igual a do sistema, não importa o arquivo.

Infelizmente isso não consigo realizar.

Share this post


Link to post
Share on other sites
HappyHippyHippo

estas a dizer que caso exista o registo no ficheiro de texto com o identificador, por exemplo, 2010, e esse registo já existe na base de dados, mesmo que os dados que estejam no ficheiro seja diferente do que exista na base de dados, então será ignorado ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
toarelli
21 horas atrás, HappyHippyHippo disse:

estas a dizer que caso exista o registo no ficheiro de texto com o identificador, por exemplo, 2010, e esse registo já existe na base de dados, mesmo que os dados que estejam no ficheiro seja diferente do que exista na base de dados, então será ignorado ?

 

Amigo eu usei como exemplo.

Na verdade seria assim: 2010, BORRACHA MACIA GRANDE,1000

código: 2010

descr.: BORRACHA MACIA GRANDE

qtde.: 1000

Se o código 2010 que consta no TXT não constar no MySql, não importa o TXT

Share this post


Link to post
Share on other sites
HappyHippyHippo

o que significa para ti "existir no mysql" ?

importa para que ? para a mesma tabela que verificas a sua "existência" ?

 


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
toarelli
17 horas atrás, HappyHippyHippo disse:

o que significa para ti "existir no mysql" ?

importa para que ? para a mesma tabela que verificas a sua "existência" ?

 

Caro amigo

Estou tentando escrever um sistema web de cotação.

O usuário importa um .TXT com mais de 200 itens para serem cotados. Para não ter que digitar um-a-um, Importa um .TXT

O .TXT é gerado de um sistema qualquer, muitas vezes abre um código no sistema, mas não no sistema web. 

Por isso preciso fazer a comparação. É onde estou tendo dificuldade.

Share this post


Link to post
Share on other sites
HappyHippyHippo
3 minutes ago, toarelli said:

Caro amigo

Estou tentando escrever um sistema web de cotação.

O usuário importa um .TXT com mais de 200 itens para serem cotados. Para não ter que digitar um-a-um, Importa um .TXT

O .TXT é gerado de um sistema qualquer, muitas vezes abre um código no sistema, mas não no sistema web. 

Por isso preciso fazer a comparação. É onde estou tendo dificuldade.

não respondenste a nenuhma questão levantada por mim ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
toarelli
1 hora atrás, HappyHippyHippo disse:

não respondenste a nenuhma questão levantada por mim ...

Amigo por exemplo:

Arquivo .TXT <== gerado por algum sistema local, como: VB / Clipper, etc

101, Caderno Grande, 30

201, Caneta Azul, 50

301, Lápis Preto, 50

401, Borracha Grande, 30

501, Régua 30cm, 20

 

Cotação WEB - MySql

101, Caderno Grande, 30

201, Caneta Azul, 50

301, Lápis Preto, 50

401, Borracha Grande, 30

 

A linha com [501, Régua 30cm, 20]  não consta no MySql, por isso não importa o TXT

Esse é o meu problema que não consigo fazer a comparação entre o TXT e o MySql.

 

O Arquivo TXT irá ser importado para a TABELA de cotação e não substituir a Tabela Produto existente no MySql.

 

Edited by toarelli

Share this post


Link to post
Share on other sites
HappyHippyHippo

vamos lá ver uma situação que continuas a não responder:

caso exista no ficheiro a infomração 

- 101, Caderno Grande, 30

e na base de dados:

- 101. Batatas fritas, 1000000

o que é para fazer ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
toarelli
4 horas atrás, HappyHippyHippo disse:

vamos lá ver uma situação que continuas a não responder:

caso exista no ficheiro a infomração 

- 101, Caderno Grande, 30

e na base de dados:

- 101. Batatas fritas, 1000000

o que é para fazer ?

Amigo estou respondendo, ou talvez como explico não entenda.

arquivo .TXT

código.........: 101

descrição....: Caderno Grande

quantidade.: 30 uni  <== quantidade que o usuário deseja comprar

 

no MySql

código.........: 101

descrição....: Caderno Grande

a quantidade não existe no MySql, isso só importa para comprar.

 

Só preciso comparar no .TXT com o MySql o CÓDIGO e DESCRIÇÃO

O Código e a Descrição, tem de estar IGUAL tanto vindo do .TXT em relação ao MySql, Caso não esteja alguém alterou em algum ponto, também não importa.

Exemplo:

TXT - cód/descr = 101, Caneta Azul

MySql cód/desc = 101, Caneta Azulada 

não importa, tem erro .

Edited by toarelli

Share this post


Link to post
Share on other sites
HappyHippyHippo

nesse caso terás de ter sempre duas acções sobre a BD para cada entrada do ficheiro:

- ler o registo da base de dados

- caso, não for encontrado, inserir

agora ,no que toca  à leitura do ficheiro, basta teres algo do géneno :

$linhas = [];
while (($linha = lerLinha($ficheiro)) !== false)
	$linhas[] = $linha;

 


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
toarelli
9 horas atrás, HappyHippyHippo disse:

nesse caso terás de ter sempre duas acções sobre a BD para cada entrada do ficheiro:

- ler o registo da base de dados

- caso, não for encontrado, inserir

agora ,no que toca  à leitura do ficheiro, basta teres algo do géneno :


$linhas = [];
while (($linha = lerLinha($ficheiro)) !== false)
	$linhas[] = $linha;

 

 

Caro amigo.

 

Por favor, me perdoa, me desculpa e imploro que tenha paciência.

Infelizmente não consegui entender, por favor teria algum exemplo para entender.

Essa parte:

$linhas = [];

while (($linha = lerLinha($ficheiro)) !== false)

$linhas[] = $linha;

 

lerLinha <== seria uma função, como a crio

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

se tomares o código que apresentaste acima, seria o ciclo foreach que itera o array com as linhas lidas do ficheiro


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
toarelli
3 horas atrás, HappyHippyHippo disse:

se tomares o código que apresentaste acima, seria o ciclo foreach que itera o array com as linhas lidas do ficheiro

apenas uma pergunta:

while (($linha = lerLinha($ficheiro)) !== false)

lerLinha <== vem da onde, como faço nessa parte, isso não entendi.

Share this post


Link to post
Share on other sites
HappyHippyHippo

era um exemplo de forma a perceberes o que fazer

como disse anteriormente, é o que tens no teu código como o ciclo que itera as linhas lidas do teu ficheiro


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.