Ir para conteúdo

POWERED BY:

Arquivado

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

Alex-23

Ler arquivos txt onde cada registro tem várias linhas

Recommended Posts

Bom dia Galera,

Recebi um arquivo txt para importar na minha base de dados muito diferente dos padrões. Os arquivos que eu recebo é uma linha para cada registro na base. e separo minhas strings conforme necessário.


while (!feof($arquivo)) {
$linhas = fgets($arquivo);
echo substr($linhas, 0, 30)."<br />";

}

Só que agora eu recebi um arquivo onde existem várias linhas para cada registro.


As 3 primeiras posições da linha é o código da linha; abaixo cópia do arquivo txt


/*

000CD xxxxxxx XXREXX EXXXESS XXGxxTXXX XXXEXXXDA 0002001007NOT000210071
310XXTXX07120000 3 11112000080000001
312ADRIANA XXINXX CXXDXXXX 00000200110700ISENTO XXGXEXXEXX XXGXXxAXX 000 APTO. 001
308 RNBRAZIL
313C000003050 RJC 1 C13 0002000207122011DIVERSOS CAIXA 00001000000000000169900000100
3072 090020110000S NORMAL 0001
319000000000000000030500000100 0000110000003000000200000011DE000285500BR SI
3140000100CAIXA 000100147 T:35 N:Ankle Boot 24000000000010000
3140000100CAIXA 000100800 T:36 N:Scarpin 4065-000000000029990
3140000100CAIXA 000100314 T:GG N:BERMUDA LOTSE000000000007990
3140000100CAIXA 000100462 T:GG N:BERMUDA DAKST000000000008990
312GEXXA MOL 00000005250000ISENTO RUA XOXXXXX LXXXXXO 000 2. ANDAR SA
308 RNBRAZIL
313C000003050 MGC 1 C6 0004005507100011DIVERSOS CAIXA 00001000000000000070000000100
3072 080020110000S NORMAL 0001
319000000000000000030500000100 0000000000000300000020000001DE000280075BR SI
3140000100CAIXA 000130093 T:38 N:Scarpin 11001000000000007990

318000000001125348000000000009004 000000000008500
*/


A cada código 312 é um novo registro e o código 314 é um item do código 312.


Alguém já teve um problema assim? para que possa me ajudar.


Obrigado


Alex

Compartilhar este post


Link para o post
Compartilhar em outros sites

Esse arquivo veio de onde? É algum arquivo de retorno de banco?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Edgar

 

Este arquivo é padrão Notfis PROCEDA

 

as 2 primeiras linhas são o header e a ultima será descartada. Mas até ae ok... O meu problema está nesse miolo.

 

Obrigado

 

Alex

Compartilhar este post


Link para o post
Compartilhar em outros sites

O manual do arquivo eu achei e já criei as variáveis que eu preciso. Se fosse uma linha por registro seria sussa! Meu problema é como ler o arquivo e interpletar mais de uma linha do arquivo txt como um registro só. uma vez que não posso limitar a quantidade de linhas por registro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas no arquivo fica claro:

 

OCCURS = 5 (P/ CADA REG. "313")

 

Este registro 314 pode repetir até 5 vezes para cada registro 313.

Logo, sua modelagem de banco de dados tem que ser 1 - N (um para muitos).

Não tem sentido colocar tudo misturado.

 

Poste sua estrutura de banco de dados que fica mais fácil te ajudar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando eu disse q não posso limitar as linhas é pq o arquivo são vários registros, no exemplo do arquivo que eu postei existem 2 registros: 1º tem 4 produtos(linhas) e no 2º registro tem 1 produto(linha);

 

Minha base corresponde 1-N.

 

Meu problema é o script para ler e interpretar este arquivo onde para cada linha com o cód. 312 eu possa ler várias linhas para que eu possa alimentar minhas variáveis e gravar no BD no esquema 1-N.

 

Neste arquivo eu tenho:

 

000 // 1ª linha de header

310 // 2ª linha de header

311 // 3ª linha de header

Até então ok... essas linhas são estáticas

 

312 // Começa o 1º registro

linhas q pertencem ao cód 312

308

313

307

319

314

314

314

314

308

A próxima linha é o 312 (novo registro) e assim haverá N registros

 

Lembrando que não estou com problemas para gravar as informações e sim ler este arquivo corretamente. Pois uma vez que o script leia correto este arquivo eu consigo alimentar as variáveis e gravar no meu BD.

 

desde já, obrigado pela atenção e ajuda

 

Alex

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo bem tosco, é só para te dar um norte:

$filename = 'arquivo.txt';
$fp = fopen($filename,'r');

$grupos = array();

while( !feof($fp) ){
	$line = trim(fgets($fp));
	
	$codigo = substr($line,0,3);
	if($codigo == '312'){
		$grupos[] = array(
			'razao_social' => substr($line,3,40)
			'notas' => array()
		);
		continue;
	}
	
	if($codigo == '314'){
		if(empty($grupos)){
			throw new InvalidArgumentException('314 alcançado sem nenhum 312');
		}
		$idx = count($grupos)-1;
		// alimente aqui com os dados necessários de cada linha
		$nota = array();
		// $nota['...'] = substr(... ,... ,...);
		$grupos[$idx]['notas'][] = $nota;
	}
}
fclose($fp);
print_r($grupos);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hugo... Perfeito a Estrutura da array!!!!

 

Só uma dúvida.. na parte do cód.

 

if($codigo == '312'){
$grupos[] = array(
'razao_social' => substr($line,3,40)

'notas' => array()

);
continue;
}
Está dando erro na linha "'notas' => array() " se eu elimino esta linha funfa de boa!

 

Só que preciso colocar mais variáveis

 

'razao_social' => substr($line,3,40)

'cnpj' => substr($line,15,11)

'ie' => substr($line,50,9)

 

etc... quando coloco está dando erro.

 

Se puder me ajudar... Assim eu implemento o código e já posto o código completo para que outras pessoas possam usar tb! rs

 

Obrigado

 

Alex

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faltou uma virgula no meu exemplo;

Tem que ficar assim:

'razao_social' => substr($line,3,40),

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.