Ir para conteúdo
Fórum Script Brasil
  • 0

Trabalhando Com Dados Em Arquivo Texto [resolvido]


rptl

Pergunta

Bom, acho que to querendo demais e não sei se vai ser possivel, mas la vai.

tenho um arquivo texto aqui (180mbs) com 98 mil registros.

todos os registros são divididos por ************************** no arquivo texto. da seguinte forma:

*********************

registro 1

dados

etc

*********************

registro 2

dados

etc

*********************

.

.

.

e assim vai (98mil!!!, cada um com mais de 15 linhas)

queria uma forma de pesquisar no arquivo texto e mostrar o conteudo dos registros. Por exemplo:

se eu pesquisar por laranja, queria que fosse mostrado todos registros que tivessem laranja entre os *****. mas teria que mostrar TODOS os campos do registro. Outro problema é que nem todos registros tem a mesma quantidade de linhas, por isso não da pra usar alguma coisa logica.

o resultado da pesquisa teria que ser assim:

*********************

registro 213

dados

laranja <palavra que busquei>

etc

*********************

registro 1454

dados

laranja <palavra que busquei>

etc

*********************

registro 4325

dados

laranja <palavra que busquei>

etc

*********************

registro 4546

dados

laranja <palavra que busquei>

etc

*********************

registro 9454

dados

laranja <palavra que busquei>

etc

*********************

.

.

.

...pesquisando todo o arquivo texto e mostrando dessa forma acima.

complicadinho né? sera que é possivel ?

Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0
olha o exemplo de 1 registro
*******************************************************************************
 Niv Local: 5       Analisado:0 Operador: 0000         Edit  Tipo cntl: U
 CNTL:              Stat reg: n Inform:010528        Usado:010528
 Tipo: a Niv Bib: m Pub Gover:  Id:   por Fonte:   d Ilus:
 Repr: r Niv cod:   Conf/Sem: 0 Pais: spb  Dat tp: s M/F/B:  0
 Ind:  0 Mod rec:   Col. Hom: 0 Cont:
 Desc: a Niv Int:   Datas: 1995,
    001    UC000633808
    020    8530803205 (broch.)
    035    0043-86760
    040    BIBLIODATA \b por
    041 1  por \h fre
    082 0  401
    090    401 \b D438k
    100 1  Derrida, Jacques, \d 1930-
    245 10 Khora / \c Jacques Derrida; traduc~ao Nicia Adan Bonatti;
           revis~ao tecnica Enid Abreu Dobranszky. -
    260    Campinas, SP : \b Papirus, \c 1995.
    300    75p.
    500    Traduc~ao de: Khora.
    650  4 Linguagem \x Filosofia.
    650  4 Ambiguidade.
    650  4 Semantica (Filosofia)
    949    1000035920 \b 0042010001 \p 00,00
    950    \9 1000035920 \a 1437 \b PGED \e D \p 00,00 \y 19970812

Link para o comentário
Compartilhar em outros sites

  • 0

pra falar a verdade em php não tem tanta experiencia assim não, menos de um mes. mas já criei um portal de busca, com arrays, paginacao, download, streaming de video, etc etc etc.

mas tenho a logica e sei o tipo de comando que preciso pra fazer as coisas. programo desde a epoca de pascal, dbaseIII plus, clipper. e php não é tão complicado.

Link para o comentário
Compartilhar em outros sites

  • 0

Opa... ótimo... se tem experiência com outras linguagens você aprende rápido... happy.gif

Então... vê se você acompanha o raciocínio...

Primeiro, você vai ter que dividir essa sua TXTbase em segmentos que representam cada entrada, digamos cada cliente...

Então você tem os "***" dividindo um cliente do outro...

Primeiramente você vai ter que pegar todo o conteúdo dessa TXTbase e passar para uma variável...

Então você vai fazer o seguinte, vai explodir essa variável [http://br.php.net/manual/pt_BR/function.explode.php] em uma array, divindindo ela pelos "***"...

Tenta fazer o código aí... e posta aqui pra eu ver... aí a gente continua... smile.gif

Link para o comentário
Compartilhar em outros sites

  • 0

Complicado né!

Mais tudo dá pra fazer! Com o delimitador "****" ele cria cada id, com tudo que tem dentro!

Vai ajudar bastante! Eu passei um dia 30 mil registro de uma só vez para o banco demorou pra caramba, ai se ele for fazer uma busca no 98 que ele tem, ele vai ficar esperando um dia pra obter resultado!

Pense ai Rptl !

Link para o comentário
Compartilhar em outros sites

  • 0

é galera

vocês me botaram pra pensar aqui. to em casa hj, não estou trabalhando e não mexi mais no codigo.

o error404 já me deu uma luz pra fazer cada registro em um array. já to com a logica na cabeça, 2a. feira de manha a gente continua.

a maquina é um servidor dell xeon 2.8HT com 1gb ram com hd SCSI 10000rpm. vou testar pra ver como os dados se comportam. se vai ser muuuuuuuuuuuito demorado.

tb não preciso de uma solucao definitiva. esse txt vai ser só pra mera consulta mesmo, pra separar algumas obras (é um banco de dados de biblioteca) e consertar o cadastro em outro banco de dados (oracle).

não vai ser consultado sempre, vai ser só pra facilitar a vida da mulherada por um periodo. elas não vao ligar de esperar 5 minutos pra fazer uma busca. vai ser mais facil do que elas pegarem as mais de 1300 folhas que foram impressas, de apenas 1,8mb...

imagina os quase 200mb que tem o arquivo. fiquei com pena delas e resolvi botar a mão na massa aqui pra ver se sai alguma coisa.

não preciso de dinamismo, só preciso de resultados.

ps: só pra gerar os 98mil registros em txt demorou 3 dias rodando um script. mas não é em esse servidor, é outro bem mais antigo.

valeu pelas ideias, segunda se eu tiver mais alguma duvida eu posto por aqui.... pelo menos a logica do que fazer eu já peguei biggrin.gif

Link para o comentário
Compartilhar em outros sites

  • 0

não rola

estamos migrando o sistema até o fim do ano. é esporadico esse tipo de coisa, mas precisa ser feito agora.

já criei a paradinha fazendo um array pra cada registro.

agora preciso pegar a logica pra criar a pesquisa.

como fazer uma pesquisa de UMA palavra ou uma string que esteja dentro da variavel?

supondo que a variavel tenha o conteudo "meu vizinho usa cueca verde"

e eu procure somente por 'cueca verde'. tem alguma funcao que procure partes de string em uma variavel ?

Link para o comentário
Compartilhar em outros sites

  • 0

eita... acho que não fiz tudo isso ainda não.

hauhua

bom o que fiz ateh agora, tudo simples...

<?php
$text=file_get_contents("text.txt"); //pegando conteudo do aquivo
$registro=explode("*************************", $text); // explodindo os registros em arrays

// essa parte é meramente informativa, só pra mostrar TODOS os registros tinham sido capturados :D

 for ($i = 0; $i <= count($registro); $i++) {
        echo nl2br($registro[$i]);
 }

Link para o comentário
Compartilhar em outros sites

  • 0

Beleza esse seu código, você fez certinho... smile.gif

Vamos para a próxima fase...

Agora a gente precisa saber o seguinte: o que separa cada linha do seu arquivo gigante?

Existem 3 opções:

• "\n" [sistemas Linux/Unix]

• "\r\n" [Windows]

• "\r" [Mac]

Agora, a gente vai separar cada linha e montar uma nova array.

Pra fazer isso, você vai usar um for ou um foreach pra ir passando cada elemento dessa array que você já criou, explodindo ela mais uma vez. Dá uma olhada no foreach [php.net], acho que você vai gostar dele. Se não enteder de 1ª, monte alguns testes pra ver como ele funciona, ou senão poste aqui.

Considerando que eu tenho o arquivo texto da seguinte maneira:

***

Fulano de tal

01.04.1970

Anta Gorda - RS

Casado

Bolinha de gude

***

Ciclano da Silva

01.01.1960

Bagdá - Iraque

Viúvo

Degolar pessoas

***

Eu faria algo assim:
$fase1 = array(''); //Essa $fase1 seria a variável que você conseguiu com o script anterior

$fase2  = array(''); //Essa é simplesmente uma array vazia que nós vamos preencher com os registros organizados

foreach($fase1 as $temp_string){

  $temp_array = explode('\r\n',$temp_string); //criando uma array temporária que vai separar a sua array por linhas

  $fase2[$temp_array[0]]['nome] = $temp_array[0];

  $fase2[$temp_array[0]]['nascimento'] = $temp_array[1];

  $fase2[$temp_array[0]]['naturalidade'] = $temp_array[2];

  $fase2[$temp_array[0]]['estado_civil'] = $temp_array[3];

  $fase2[$temp_array[0]]['hobbies'] = $temp_array[4];

}

Entendeu o raciocínio? smile.gif

Link para o comentário
Compartilhar em outros sites

  • 0

entendi sim. mas não preciso de algo taooooo detalhado assim e dividido por campos

é mais simples a coisa. é só pesquisar dentro de toda a variavel e ver se tem uma ou duas palavras pra pesquisar. se tiver é só dar um echo no registro inteiro.

Link para o comentário
Compartilhar em outros sites

  • 0

valeu error!

não preciso de tanto, mesmo porque o que vai nos registros ta em formato marc21, que tem um monte de peculiaridades e não da pra definir certinho....

só preciso do comando pra fazer a comparacao da palavra com o que tem na variavel pra colocar no meio daquele FOR!!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,2k
×
×
  • Criar Novo...