Alex-23 0 Denunciar post Postado Outubro 23, 2013 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. 001308 RNBRAZIL313C000003050 RJC 1 C13 0002000207122011DIVERSOS CAIXA 000010000000000001699000001003072 090020110000S NORMAL 0001 319000000000000000030500000100 0000110000003000000200000011DE000285500BR SI3140000100CAIXA 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 SA308 RNBRAZIL313C000003050 MGC 1 C6 0004005507100011DIVERSOS CAIXA 000010000000000000700000001003072 080020110000S NORMAL 0001 319000000000000000030500000100 0000000000000300000020000001DE000280075BR SI3140000100CAIXA 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
ESerra 744 Denunciar post Postado Outubro 23, 2013 Esse arquivo veio de onde? É algum arquivo de retorno de banco? Compartilhar este post Link para o post Compartilhar em outros sites
Alex-23 0 Denunciar post Postado Outubro 23, 2013 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
Dorian Neto 41 Denunciar post Postado Outubro 23, 2013 http://php.net/manual/pt_BR/function.file.php :) Compartilhar este post Link para o post Compartilhar em outros sites
hufersil 145 Denunciar post Postado Outubro 23, 2013 Mano, procurei no Google e veio um monte de resultados. Inclusive: http://www.ghsix.com.br/subhtm/EDI-TRANSP.doc Lendo ele, é só implementar. @braços Compartilhar este post Link para o post Compartilhar em outros sites
Alex-23 0 Denunciar post Postado Outubro 23, 2013 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
hufersil 145 Denunciar post Postado Outubro 23, 2013 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
Alex-23 0 Denunciar post Postado Outubro 23, 2013 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
hufersil 145 Denunciar post Postado Outubro 23, 2013 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
Alex-23 0 Denunciar post Postado Outubro 23, 2013 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
hufersil 145 Denunciar post Postado Outubro 24, 2013 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