Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

xAcesHighx

! TXT p/ Banco (MySQL)

Recommended Posts

Galera, estou tendo um trabalho complicado p/ resolver. Comecei a estudar PHP a 4 meses e não tenho mto conhecimento, é o seguinte.

É um pouco extenso, mas gostaria que vocês me ajudassem.

 

Primeiramente, existe um programa que gera uma listagem de pedidos via txt, cada pedido fica em uma linha. Neste programa que gera esses pedidos os campos tem um limite máximo de caracteres, por exemplo o campo e-mail pode ter no máximo 50 e no txt não existe nenhum caracter que diferencia um campo do outro, vejam o exemplo nesse link abaixo:

 

LINK: http://www.vibetrance.com.br/ex/exemplo.txt

 

Explicando o arquivo txt:

 

Como os campos vindos programa p/ o txt tem limites de caracteres, supondo que no campo e-mail haja 20 caracteres, ele faz uma conta 50-20=30 e deixa 30 caracteres em branco até chegar ao outro campo e assim por diante.

 

Achei na net um código que exporta p/ o banco, o problema é que precisa de uma "," para entender que muda para um outro campo.

 

Olhem o código abaixo:

 

<? if($submit) { $dbhost = ""; $dbuser = ""; $dbpass = ""; $dbname = ""; $con = mysql_connect($dbhost, $dbuser, $dbpass); mysql_select_db($dbname, $con); $mypath="./upload/"; //NESTA LINHA VOCÊ COLOCA O LOCAL ONDE TEM PERMISSÃO DE GRAVACÃO PARA QUE O ARQUIVO POSSA SER UPLOADADO $mytable="TABELA"; // AQUI VOCÊ ESCOLHE O NOME DA TABELA if ($upfile_size<="100000000") { // LIMITE DE UPLOAD DE 100K $status="Ok"; $uploaded=date("YmdHis"); $myfile=$mypath .$uploaded .".csv"; //AQUI ELE RENOMEIA O ARQUIVO .CSV = TABELA DE EXCEL if (copy($upfile, $myfile)) { $status.=", arquivo copiado para a pasta UPLOAD."; //COLOCAR O ARQUIVO NA TABELA $insert_csv="LOAD DATA LOCAL INFILE '$myfile' INTO TABLE $mytable FIELDS TERMINATED BY ','"; $result_csv = mysql_query($insert_csv, $con) or die("NÃO VIROU ... " .mysql_error()); echo "$myfile<br>"; echo "$upfile<br>"; if ($result_csv) { $status.=" e gravado no banco de dados."; } else { $status.=" MAS NÃO FOI POSSIVEL COLOCAR NA BASE DE DADOS"; } } else { $status.="... O ARQUIVO NAO FOI COPIADO"; } echo "$status"; } else { echo "ARQUIVO MUITO GRANDE"; } } else { ?> <head> <title>Upload csv-file</title> </head> <body bgcolor="#ffffff" text="#000000" id=all> <form enctype="multipart/form-data" action="<? echo "$PHP_SELF"; ?>" method=POST> <div align="center"> <table border="0" cellpadding="0" cellspacing="0" width="600" align="center"> <tr> <td width="200" align="left" valign="top">UPAR TXT FUGANHOLI </td> <td width="400" valign="top"><input name="upfile" type="file"><br><br></td> </tr> <tr> <td width="100%" colspan="2" align="center"><input type="submit" name="submit" value="Upload"></td> </tr> </table> </div> </form> </body> <? } ?>

MINHA NECESSIDADE e exportar como faz este código acima, mas sem conter essa vírgula que é responsável por diferenciar um campo do outro. Alguém poderia me ajudar.

 

 

Desde ja grato ...

ME AJUDEM !!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

esse padrao é muito usado e é bem organizado, melhor que separar por algum caractere, pois imagina se os dados estiverem separados por ; dai uma pessoa digita esse caractere e pronto seu sistema ficou com falhas e ira separar os dados de um modo errado

 

o certo é desse deixo mesmo dai você pega esse arquivo abre ele usando a função file() essa função ira pegar todo o conteudo do txt e colocar um array, cada numero do array reperesntara uma linha do txt

 

depois só usar substr para pegar os dados de cada linha substr(string, inicio, quantidade), assim você pega os pedaços da onde você quiser

sei que você pode nao ter entendido muito bem por isso fiz um exemplo para você entender melhor

 

$file = file("exemplo.txt");

for($i = 0; $i < count($file); $i++) {
$email	= substr($file[0], 0, 39);
$empresa  = substr($file[0], 39, 35);
$endereco = substr($file[0], 75, 40);
echo trim($email). "<br />";	
}

 

baseado no meu exemplo voce faz o resto e basta você prestar atenção e só contar os campos e tamanhos e assim usar no substr

 

qualquer duvida posta ai

Compartilhar este post


Link para o post
Compartilhar em outros sites

Poutz Fabyo, pensei que essas paradas de espaços em branco não tinha solução, ainda bem que tu disse q eh uma forma organizada.Bom, eu pedi pro cara que desenvolveu o programa me mandar então a listagem dos caracteres máximos em cada campo, ateh aí tudo ok!Tenho algumas dúvidas, vê se pode me ajudar. Antes tinha feito um código p/ mandar p/ o banco um cliente por vez, o php lia $file = file("exemplo.txt");... MAS ... a pessoa que faria isso, disse que demoria mto tempo, supondo que ela tivesse 80 clientes, ela teria que mandar 80 vezes.Daí achei a solução neste código que postei, porém como você viu ele diferencia os campos por ",". Pensei que o programador conseguisse colocar as virgulas, mas não.Então o que ocorreu foi isso.Neste código que você postou:$empresa = substr($file[0], 39, 35); => 39 caracter limite e 35 o que foi lido no txt ? ou não tem nada a ver ?Pq assim, os dados vem em várias linha, cada linha seria uma ID pra ir pro banco, e eu nunca saberia pra programar no php.teste@teste.com.br teste me são paulotestando@testando.com.br testando ltda campinasE uma outra questão, e principal, a partir disso é possível incorporá-lo ao código que eu postei, vendo que no LOAD pra grava ele pega campos terminados em "," e partir do seu código não seria mais isso não é?Se tu poder me dar uma força aí, fico agradecido demais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fabyo, eu dei uma fussada nakele código que postou e acho que não tem mto a ver com aquilo que eu disse sobre $email = substr($file[0], 0, 39); http://forum.imasters.com.br/public/style_emoticons/default/ermm.gif

E [0] ele lê soh a primeira linha. No caso seriam várias. Aí no lugar do [0] coloquei $i ele listou todas as linhas.

 

 

Vê se você pode me ajudar a adaptar o que você postou ao código que eu postei.

 

 

Valeu .

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa desculpe ai foi uma falha minha, o file lista o conteudo completo

lembra que eu falei cada array representa uma linha, entao $file[0] = linha1, $file[1] = linha 2 e assim por diante veja meu exemplo eu coloquei apenas $file[0] por isso só pegou a linha 1

 

$file = file("exemplo.txt");

for($i = 0; $i < count($file); $i++) {
$email	= substr($file[$i], 0, 39);
$empresa  = substr($file[$i], 39, 35);
$endereco = substr($file[$i], 75, 40);
echo trim($email). "<br />";	
}

 

esse exemplo que eu to te mostrando é uma solução para seu problema

esquece o exemplo que voce postou que nao tem nada haver com o que voce precisa, como falei o seu txt nao esta separado por virgula ele esta limitado a espaços, isso é muito usado em sistema EDI bancos usam esses tipo de formatação chama CNAB, e empresas multinacionais tbm usam nesse padrao por exemplo ANFAVEA que cuida das montadoras de veiculos em geral

 

só para esclarecer outra duvida o substr pega o inicio de uma frase e a quantidade, só voce passar da onde ele ira começar a ler e quantos caracteres ler

 

qualquer duvida posta ai

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa!Funfou beleza, mas ...

$file = file("exemplo.txt");for($i = 0; $i < count($file); $i++) {				$email		 = substr($file[$i], 0, 40);	$empresa	= substr($file[$i], 40, 40);	$endereco   = substr($file[$i], 80, 40);	$bairro		  = substr($file[$i], 120, 25);	$cidade		  = substr($file[$i], 145, 25);			echo trim($email).($empresa).($endereco).($bairro).($cidade)."<br />";	}
Resultado:

joaodasilva@silva.com.br silva sociedade anônima rua júlio mesquita centro araras anacristinaborges@borgescia.com.br borges companhia rua tiradentes central limeira jucac@empresadojuca.com.br jucas empresas rua nunes machado centralizado rio claro joanaparda@parda.com.br programa do teste rua visconde centrodacidade são paulo

Tipo, como você viu, tá firmeza.Mas caí na questão de levar esses dados p/ o banco, porém não tenho nenhum caracter que diferencie um campo do outro, não é?Se eu conseguir distinguir os campos e gravar p/ o banco, FECHO! Andei estudanddo numas apostilas mas não achei nada que suprisse esse problema.Tem idéia de como fazer isso???Obrigado por ter solucionado 50% dos meus problemas. Valeu mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ué você nao percebeu ainda?

 

a função substr faz exatamente isso, veja no meu exemplo

 

eu separo em variaveis os dados

dai vai ficar $email, $empresa etc... e dai só gravar no banco de dados

 

cada variavel tem o dado separado só você ver cada variavel separadamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

:D Ahn, sakei agora.

Tipo, fiz e gravei pro BD.

Só que ele tá soh gravando apenas a última linha do txt.

Olha meu código:

 

<?php$host = ""; $user = ""; $password = ""; $db = ""; $file = file("exemplo.txt");for($i = 0; $i < count($file); $i++) {$email		  = substr($file[$i], 0, 40);$empresa	 = substr($file[$i], 40, 40);$endereco	= substr($file[$i], 80, 40);$bairro		 = substr($file[$i], 120, 25);$cidade		   = substr($file[$i], 145, 25);}$con = mysql_connect($host, $user, $password); mysql_select_db($db, $con); $sql = "INSERT INTO TESTE (email, empresa, endereco, bairro, cidade) VALUES('$email', '$empresa', '$endereco', '$bairro', '$cidade')"; $result = mysql_query($sql) or die(mysql_error()); ?>

Tem alguma coisa que complementa p/ gravar todas as linhas?

 

 

Valeuuuuu !

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, você precisa colocar dentro do loop a função para gravar

 

exemplo:

 

<?php
$con = mysql_connect("localhost", "user", "password");
mysql_select_db($db, $con);

$file = file("exemplo.txt");
for($i = 0; $i < count($file); $i++) {
$email		  = substr($file[$i], 0, 40);
$empresa	 = substr($file[$i], 40, 40);
$endereco	= substr($file[$i], 80, 40);
$bairro		 = substr($file[$i], 120, 25);
$cidade		   = substr($file[$i], 145, 25);

$sql = "INSERT INTO TESTE (email, empresa, endereco, bairro, cidade) VALUES('$email', '$empresa', '$endereco', '$bairro', '$cidade')";
mysql_query($sql) or die(mysql_error()); 
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa!Foi beleza!Muito agradecido mesmo, principalmente sobre aquele primeiro esquema dos espaços em branco.Não há salvação sem caridade.Valeu,Vou tentar tb ajudar o pessoal q posta aqui naquilo q sei.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tive que subir novamente o tópico. :) O txt que o programador esta me mandando, alguns campos estão caindo para a linha de baixo. Ele disse q no programa estão tudo em uma, mas qdo abre é um editor txt inevitavelmente à essa quebra de linha.É possível catar os dados de um cliente tb numa segunda linha, mas q represente um cliente.E a idéia minha após dar um insert nos dados e gravá-los p/ o banco é mandar um e-mail para cada cliente, contendo no e-mail os dados que vieram do txt, exemplo: número do pedido, valor, etc, etc.Queria enviar esse e-mail já após gravar no banco, soh q tou tendo um problema, como pegar os dados individuais de cada cliente e mandar?Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

se o txt esta certo, nao tem problema nenhum no php, o editor de txt que quebra linha, se for o caso use um outro editor, mas o sistema php vai ler a linha inteira normal

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou mandando os e-mails, depois q grava p/ o banco. $embarque = substr($file[$i], 54, 8); ===> recebe data, tipo: 20060305 (nesse formato)Eu conheço uma forma de gravar o/ o banco no nosso formato. 05/03/2006Só que os e-mails que eu estou mandando, ele não pega do banco, ele pega do txt e esta indo 20060305.Alguém sabe como reverter isso???Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema da data resolvi na boa.Mas comecei a testar o txt com mais de um cliente (tipo 5 clientes) e ele envia todos o pedidos para o e-mail do cliente, qdo no caso teria q enviar apenas o dele.Olhem o código.<? if($submit) { // aqui tem a parte que conecta no banco, e grava numa pasta. if (copy($upfile, $myfile)) { $file = file("$upfile");for($i = 0; $i < count($file); $i++) {$email = substr($file[$i], 0, 40);$nrped = substr($file[$i], 40, 6);$entrada = substr($file[$i], 46, 8);$embarque = substr($file[$i], 54, 8);$sql = "INSERT INTO Embarque (email, nrped, entrada, embarque) VALUES ('$email', '$nrped', '$entrada', '$embarque');$result = mysql_query($sql) or die(mysql_error());// enviando e-mail:$cabecalho = "<html> <head> <title>Empresa Teste</title> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\"> </head> <body>";$corpo .= "<table><tr><td>$email - $nrped - $entrada - $embarque</td></tr> </table></body></html>"; // enviar mail("$email","Entrega de pedido","$corpo","$cabecalho\nFrom:Empresa<teste@teste.com.br>"); } }}?> ---------------------O código esta resumido soh em alguns campos.ALGUEM SABE O QUE POSSO USAR PARA ELE MANDAR O PEDIDO PARA SEU RESPECTIVO E-MAIL ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

primeira coisa isso ta errado

 

if($submit) {

 

o certo é

 

if(isset($_POST["submit"])) {

 

e sobre o email, é só você testar os emails dentro do loop para ver se ta tudo certo e usar a função mail que ira mandar os emails para $email que tiver la

Compartilhar este post


Link para o post
Compartilhar em outros sites

// ENVIAR E-MAILmail("$email","Entrega de pedido","$corpo","$cabecalho\nFrom:Empresa<fabio@vibetrance.com.br>"); } // FECHA FOR } // FECHAR IF } // FECHA IF DO SUBMIT?>A função mail esta dentro do loop.Assim: A primeira linha recebe apenas o seu. (email)A segunda linha recebe o seu + o e-mail da primeiraA terceira linha recebe o seu + o da segunda e primeiraVocê sabe o que pode estar havendo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao pode estar acumulando emails, cada linha tera apenas 1 email distinto

 

como falei tesat os emails para ver como estao vindo da um echo dentro do loop na $email e veja como ta

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.