Ir para conteúdo

POWERED BY:

Arquivado

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

David SP

[RESOLVIDO] Importar txt - dados em linhas

Recommended Posts

Ola Pessoal,Estou precisando importar um arquivo TXT para o MySQL, porém, os dados estão em linhas. Não achei um tópico falando sobre o assunto, por isso estou postando a dúvida aqui.Estrutura do arquivo texto:Nome da EmpresaEndereço, Nº, BairroCep, Cidade - EstadoTelefoneemailLinha de produtosNome da EmpresaEndereço, Nº, BairroCep, Cidade - EstadoTelefoneemailLinha de produtosComo poderia importar este arquivo?AbraçosDavid

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vê se essa leitura ajuda: http://forum.imasters.com.br/index.php?sho...6026&hl=txt

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

dúvidas posta seu codigo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Paulo,Eu olhei o seu exemplo e achei interessante, porem, pelo que eu entendi eu precisaria ter um espaço determinado entre os campos no meu arquivo texto para esse codigo funcionar. Assim, precisaria manualmente dar tabs ou espaçamentos entre os campos para estabelecer um numero de caracteres exatos. Ex:Nome da Empresa (50 carac)Endereço (50), Nº (5), Bairro (20)É isso?Eu estava pensando em uma outra maneira talvez um pouco mais facil de fazer isto. Colocar cada campo em uma linha e trazer a linha. Fiz o seguinte:Criei um arquivo texto (nomes.txt) com:nomeenderecotelnomeenderecotel

<?php$conexao = mysql_connect("localhost", "xxx", "xxx");$db = mysql_select_db("xxx");$arquivo = 'nomes.txt';$arq = fopen($arquivo,'r');while(!feof($arq))$linha[] = fgets($arq); // cria um array com o conteudo do arquivo$sql = "INSERT INTO teste (nome, endereco, tel, branco) VALUES ('$linha[0]', '$linha[1]', '$linha[2]', '$linha[3]')";$result = mysql_query($sql) or die(mysql_error());?> 

O código importou as primeiras quatro linhas.Minha dúvida: Como fazer para que quando chegar na linha 5, ele comece denovo, contando a linha 5 o campo "nome" de um novo registro"?Agradeço a atenção.AbraçosDavid

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, David, bem-vindo ao fórum.Para importar, supondo que seu arquivo de texto segue exatamente esta formatação, você poderia então ler o conteúdo, linha por linha, ao mesmo tempo que incrementa um contador. Verifique então a cada reinício do loop se o módulo por sete desse contador é zero (exemplo, $i % 7 == 0), e apenas incremente o contador. Assim você salta a linha e executa a query, aí o contador segue adiante e retoma o próximo "registro".Estou de saída agora, mas posta aí o que conseguiu entender, aí vou te ajudando ;)[]sAnderson Mello

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Anderson, obrigado pela ajuda.

 

Além de novo no fórum, sou iniciante em PHP...

 

O que significa: "Verifique então a cada reinício do loop se o módulo por sete desse contador é zero (exemplo, $i % 7 == 0)"?

 

Eu tentei fazer um loop, porém não tive sucesso...com certeza estou fazendo algo errado, pois está estourando o tempo o tempo de execução de 30s.

 

O código:

 

<?phpinclude 'conexao.php';$arquivo = 'nomes.txt';$arq = fopen($arquivo,'r');$i = 1;$linha[] = fgets($arq);while(!feof($arq)){	$nome = $linha[$i];	$i++;	$endereco = $linha[$i];	$i++;	$telefone = $linha[$i];	$i++;	$fax = $linha[$i];	$i++;		$sql = "INSERT INTO teste (nome, endereco, telefone, fax) VALUES ('$nome', '$endereco', '$telefone', '$fax')";$result = mysql_query($sql) or die(mysql_error());		   } ?>

 

Agradeço a ajuda de vocês para resolver isto.

 

Abraços

 

 

David

Compartilhar este post


Link para o post
Compartilhar em outros sites

Saudações, entra no prompt de comando do mysql e faz assim:load data infile "diretorio/arquivo.txt" into table nomedatabela fields terminated by ',' enclosed by '"' lines terminated by '\r\n'É muito veloa este comando...Espero ter dado tempo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Julio, muito obrigado pela ajuda.Tentei fazer o que voce descreveu. Entrei no PHPMyAdmin, acessei a tabela teste e cliquei em SQL (este é o prompt de comando?)Digitei:load data infile "admin/nomes.txt" into table teste fields terminated by ',' enclosed by '"' lines terminated by '\r\n'e apareceu a mensagem:Erroconsulta SQL:LOAD DATA INFILE "admin/nomes.txt" INTO TABLE teste FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'Mensagens do MySQL : Documentação#1045 - Access denied for user: 'yara@localhost' (Using password: YES)Minhas dúvidas:1)o diretório base é a raiz? o meu arquivo texto esta em admin/nomes.txt.2)Essa instrução que voce me passou faz com que o SQl importe um arquivo texto com a seguinte estrutura a baixo (que é o que eu preciso)?nome1endereco1telefone1nome2endereco2telefone2nome3endereco3telefone3AbraçosDavid

Compartilhar este post


Link para o post
Compartilhar em outros sites

David, acho que você nos confundiu ^_^ Há três estruturas de arquivos. Uma com vários dados, outra com nome, endereço e telefone e outra incluindo o fax. Qual é a estrutura deste txt?Você quer fazer uma rotina para importar vários arquivos de texto nesta estrutura ou é uma inserção inicial apenas?[]sAnderson Mello

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Anderson,Desculpe se acabei misturando as coisas.É que na primeira resposta o PauloRJ deu uma sugestão em que pelo que eu entedi, eu precisaria ter no arquivo texto os campos delimitados por tamanhos fixos, como nome (50 caracteres), telefone (20 caracteres), etc.Porém, nesse meu arquivo texto, eu não tenho um delimitador fixo, como "," ";" "tabulações", etc...Então, eu achei mais facil deixar um campo em cada linha e importar cada linha como sendo um campo.A estrutura atual do meu txt está assim:empresa1endereco1telefone1empresa2endereco2telefone2empresa3endereco3telefone3e assim por diante.Eu preciso que o codigo entenda a linha 1=campo1, linha 2 = campo2, linha3=campo3, ignore a linha 4 (que está em branco) e quando chegar na linha 5 (que e uma nova empresa, ou seja, um novo registro), ele comece novamente linha5=campo1, linha6=campo2, linha7=campo8, ignora linha 9 (novamente em branco).Eu fiz o codigo:<?phpinclude 'conexao.php';$arquivo = 'nomes.txt';$arq = fopen($arquivo,'r');$i = 1;$linha[] = fgets($arq);while(!feof($arq)){ $nome = $linha[$i]; $i++; $endereco = $linha[$i]; $i++; $telefone = $linha[$i]; $i++; $sql = "INSERT INTO teste (nome, endereco, telefone) VALUES ('$nome', '$endereco', '$telefone')";$result = mysql_query($sql) or die(mysql_error()); }?>Mas está estourando o tempo de execução de 30s.Agradewço a ajuda.AbraçosDavid

Compartilhar este post


Link para o post
Compartilhar em outros sites

30 segundos é um limite padrão. Se o arquivo for muito grande, ocorrerá isso.Se teu código está inserindo os primeiros registros corretamente, experimenta então colocar set_time_limit(0) no início do arquivo e faça um novo teste ;)[]sAnderson Mello

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola Anderson,O arquivo texto que estou usando e um arquivo de teste. Ele contém exatamente os seguintes dados:nomeenderecotelnome1endereco1tel1nome2endereco2tel2Como da para ver, o arquivo e bem pequeno.Eu percebi que na tabela "teste" foram criados os 3 registros, porém apenas o campo nome do primeiro registro foi preenchido. Os outros estão em branco.Deve haver algum problema no meu código...tanto que eu inseri set_time_limit(0) conforme sua sugestão, e a pagina não parou de carregar. Fui olhar a tabela e haviam quase 100 registros..todos em brancoAbraçosDavid

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta o seguinte:

 

<?phpinclude 'conexao.php';$arquivo = fopen ("nomes.txt", "r");$i = 1;while (!feof ($arquivo)) {	$controle = $i % 4;	$linha = fgets($arquivo, 4096);		switch($controle) {		case 1:		$nome = $linha;		break;				case 2:		$endereco = $linha;		break;				case 3:		$telefone = $linha;		$sql = "INSERT INTO teste (nome, endereco, telefone) VALUES ('$nome', '$endereco', '$telefone')";		$result = mysql_query($sql) or die(mysql_error());	}	$i++;	}fclose ($arquivo);?>

Funcionando, você pode então pegar o nome do arquivo vindo de um form e fazer uma interface para importar os arquivos.

 

[]s

Anderson Mello

Compartilhar este post


Link para o post
Compartilhar em outros sites

ola pessoal, primeiramente desculpe ressuscitar este assunto mais estou com um problema no qual v/c´s já ajudou outro companheiro David.

 

no meu caso estou tentando importar alguns dados de formulário pre-impresso seguindo uma estrutura de 28 linhas por pessoa ou seja a cada 28 linhas uma nova "importação" como fazer isto?

 

Meu script esta +- assim:

 

$arquivo = basename({arquivo});

$caminho = $_SERVER['DOCUMENT_ROOT'] . "/gercoof_2/file/doc/".$arquivo;

$conteudo = fopen($caminho, "r");

 

$i = 1;

 

while (!feof ($conteudo)) {

$controle = $i % 27;

$linha = fgets($conteudo, filesize($caminho));

 

switch($controle) {

case 1:

$cnpj = substr($linha,10,18);

$telefone = substr($linha,35,10);

break;

 

case 2:

$razao = substr($linha,11,39);

break;

 

case 3:

$ender = substr($linha,10,31);

 

case 4:

$bairro = substr($linha,8,8);

$cidade = substr($linha,24,17);

$uf = substr($linha,44,2);

 

case 5:

$lixo = $linha;

 

 

echo nl2br($cnpj);

echo nl2br($telefone);

echo nl2br($razao);

echo nl2br($ender);

echo nl2br($bairro);

echo nl2br($cidade);

echo nl2br($uf);

 

// $sql = "INSERT INTO teste (nome, endereco, telefone) VALUES ('$nome', '$endereco', '$telefone')";

//$result = mysql_query($sql) or die(mysql_error());

}

 

$i++;

}

fclose ($conteudo);

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.