• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

QuickFire

Função Search

19 mensagens neste tópico

Boas,

Pode parecer uma dúvida n00b mas eu após alguma pesquisa não enconrei...

O que gostaria de saber era como desenvolver uma função search que basicamente procurava a informação X na variavel Y e depois fizesse o return dos resultados.

O meu objectivo é fazer uma pesquisa num file txt com 5 mb :)

Eu sei que tenho a hipotese de passar os dados do txt para MySQL mas a base de dados é updated todos os meses e é chato tar a passar todos os meses para MySQL. Em ultimo caso considero essa hipotese :)

Alguém tem alguma função dessas?

Thanks :)

Pedro Diogo aka. QuickFire :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

aproveito o topico para pedir ajuda mas para mysql

queria pesquisar numa base de dados mysql os dados tipo pesquisar xpto

na base de dados noticias tenho

titulo Olá bem vindo

Texto este site é mesmo xpto

e com a pesquisa ir buscar esse registo

fiz me entender?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@mota77

$texto = "xpto";
$query = "SELECT * FROM tabela WHERE texto LIKE '%$texto%'";
mysql_query($query);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que gostaria de saber era como desenvolver uma função search que basicamente procurava a informação X na variavel Y e depois fizesse o return dos resultados.

@QuickFire

Podes explicar melhor ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que gostaria de saber era como desenvolver uma função search que basicamente procurava a informação X na variavel Y e depois fizesse o return dos resultados.

@QuickFire

Podes explicar melhor ?

Eu tenho um txt com nomes numeros e várias informações sobre pessoas em linhas separadas para cada pessoa.

O que queria era fazer um input html onde as pessoas procurassem o seu nome ou número e em seguida aparecessem as hipoteses que foram encontradas no search.

Em MySQL é facil fazê-lo mas pelas razões que já disse acima era chato também :\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É um bocado dificil fazer isso.. Vais ter que aprender expressões regulares > http://weblogtoolscollection.com/regex/regex.php...

Podes utilizar a função file(); para abrir e ler o ficheiro .txt e depois a função eregi(); ou preg_match(); para fazer o search no ficheiro.

(Aconselho-te a utilizar mysql para além de ser mais fácil fazer isso os dados ficam muito mais seguros e dependendo de como é feito o update todos os meses da Mysql podes até criar um script que faça o update automaticamente no dia X)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, segundo percebi tens os vários dados por linhas e cada linha equivale aos dados de uma pessoa só,

portanto parto do princípio que em cada linha tens de dividir o nome, nr telefone, etc, etc...

Alto tipo: Utilizador**123456**xxxx@xx.com certo?

Se for isso, assim de repente e fazendo isso em cima do joelho como se costuma dizer, talvez isto funcione para o que queres:

<?php
/*
     =IceBurn= 2006
--> WWW.TENHAMEDO.NET <--

*/

$q = trim($_GET['q']); /* Ex: http://site.com/ficheiro.php?q=  */

$ficheiro = @file("dados.txt"); /* Supondo que o ficheiro onde tens os dados é dados.txt */

$p = @count($ficheiro);

for ($i = $p-1; $i >= 0; $i--) {
       
$busca = @explode("**",$ficheiro[$i]); /* Meti asteriscos s dividir os dados, 
                                         obviamente que depois tens de alterar 
                                         para o separador que usas. */
   
   if (preg_match("/$q/i", $busca[0])) /* Vamos partir do princípio que queres encontrar 
                                          nomes identicos.... portanto vamos procurar no 
									  primeiro campo da linha */
   { 
     $resultado[] = $busca[0]; /* metemos os resultados numa nova array */
   }
}

if (is_array($resultado)) 
{

$total = count($resultado);

echo "<b>Encontrados $total resultados:</b><br/>";

foreach($resultado as $valor) {
                                 /* Aqui exibimos os resultados */
  echo "$valor<br/>";
}
} else {
  
  echo "Nao foram encontrados resultados";
  
}
?>

Claro que depois tens de adaptar isto ao que pretendes, mas penso que o básico tá feito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, segundo percebi tens os vários dados por linhas e cada linha equivale aos dados de uma pessoa só,

portanto parto do princípio que em cada linha tens de dividir o nome, nr telefone, etc, etc...

Alto tipo: Utilizador**123456**xxxx@xx.com certo?

Se for isso, assim de repente e fazendo isso em cima do joelho como se costuma dizer, talvez isto funcione para o que queres:

<?php
/*
     =IceBurn= 2006
--> WWW.TENHAMEDO.NET <--

*/

$q = trim($_GET['q']); /* Ex: http://site.com/ficheiro.php?q=  */

$ficheiro = @file("dados.txt"); /* Supondo que o ficheiro onde tens os dados é dados.txt */

$p = @count($ficheiro);

for ($i = $p-1; $i >= 0; $i--) {
       
$busca = @explode("**",$ficheiro[$i]); /* Meti asteriscos s dividir os dados, 
                                         obviamente que depois tens de alterar 
                                         para o separador que usas. */
   
   if (preg_match("/$q/i", $busca[0])) /* Vamos partir do princípio que queres encontrar 
                                          nomes identicos.... portanto vamos procurar no 
									  primeiro campo da linha */
   { 
     $resultado[] = $busca[0]; /* metemos os resultados numa nova array */
   }
}

if (is_array($resultado)) 
{

$total = count($resultado);

echo "<b>Encontrados $total resultados:</b><br/>";

foreach($resultado as $valor) {
                                 /* Aqui exibimos os resultados */
  echo "$valor<br/>";
}
} else {
  
  echo "Nao foram encontrados resultados";
  
}
?>

Claro que depois tens de adaptar isto ao que pretendes, mas penso que o básico tá feito.

Muito bom -IceBurn- ! Era isso mesmo que precisava :cheesygrin: Dou-te os parabéns porque o código está muito bem documentado :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok o código está excelente mas tenho um problema...

Como não fui eu que criei o txt, este para separar os vários elementos usa espaços. Estes espaços estão de forma muito irregulares a separar os elementos...

Eu queria saber se alguém sabe substituir por exemplo se o nº espaços for superior ou igual a 2 subtituir isso por apenas um espaço.

Com um exemplo prático: '123123          Pedro Diogo  123'. Queria substituir os espaços a mais por apenas um espaço :D

Parece complicado mas tenho estado a pensar nisto e não consigo encontrar solução :)

Thanks

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois, quem fez isso devia de ter posto um separador....

De qualquer maneira experimenta assim:

<?php

$ficheiro = file("dados.txt"); 

$f = fopen("dados.txt","w");
foreach($ficheiro as $linha) {

$linha = ereg_replace("  ", " ", ltrim($linha));
fputs($f, $linha); 
}
fclose($f);
?>

Corre isto uma vez e verifica se funcionou, mas aconselho-te a fazeres primeiro um backup do ficheiro.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

????

o explode deve funcionar sem problemas, mesmo que uses mais do que um espaço.

Anyway... algumas considerações sobre pesquisas, pois é o que me anda a ocupar o tempo ultimamente.

As técnicas que voces falaram funcionam e para pequenos volumes de dados até podem ser o mais indicado. No entanto se tiverem alguma ambição e se quiserem utilizar tecnicas de pesquisa robustas não podem usar as que referiram.

Por exemplo... estás preocupado em usar mysql porque tens k fazer um update de nao sei quanto em nao sei quanto tempo, mas depois vais por cinco megas para dentro de um array num script de php.

Porque é que nao fazes um script para por isso para dentro de uma base de dados e automatizas o processo com uma crontab? ou melhor ainda, usa uma base de dados desde inicio.

Quanto ao iso do %LIKE%, parece simples e eficaz e até funciona, mas na verdade o mysql vai ter que ler os campos de todas as linhas à bruta e ver se alguma satisfaz a condição. Isto numa base de dados de tamanho médio pode brecar completamente o sistema.

Estes forums por exemplo usam um sistema de indexação próprio. Cada vez que uma mensagem é inserida, as virgulas e o bb code sao filtrados, a mensagem é dividida palavra a palavra e depois esta é guardada numa tabela da base de dados con um indice do tipo btree. depois existe outra tabela para fazer o relacionamento com o id da mensagem. Isto sim é muito mais rápido.

A boa noticia é: não precisam de fazer nada disto, o mysql já tem esta funcionalidade embutida, chama-se fulltext search.

A razão pela qual os forúns fazem esse processo manualmente ao nivel da aplicacação... penso que é devido ao facto de usarem uma camada abstracional de bases de dados compativel com varios sgbds, não suportando todos pesquisas deste tipo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens toda a razão do mundo...

Eu vou passar isto para MySQL e procurar decentemente...

Realmente o explode (função que uso até bastante) funciona para o que quero... tantas horas nisto e só depois de me ir distrair é que sai algo de produtivo :)

Thanks

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem fim da minha jornada...

Conclusão? MySQL :)

O ficheiro txt é um caos em formatação e eu manualmente nunca na vida conseguiria inserir todos os dados em MySQL...

Disse ao meu pai a situação e veio logo ele dar-me a ideia que aquilo se podia passar para XLS e depois para MySQL :D O Excel tratou das formatações todas graficamente e depois foi só importar com o Navicat :D

Tava a ver que nunca mais acabava :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nao sei em que formato é que tinhas o ficheiro de dados, provavelmente num formato prórpio com o qual estejas familiarizado e seja da tua preferencia.

Eu uso muitas vezes ficheiros de dados como cache. Vou pondo dados para ficheiros de texto separando por exemplo as colunas com espaços e as colunas por endlines.

Depois escrevo um micro-script em php para importar isso para a base de dados e é só correr o scriptzinho de tempos a tempos. Mas isso já é uma questão de preferencia.

Bom desenrascanço, assim é que é, como qq bom engenheiro.

Já agora, um pouco de OT... n ias candidatar.te este ano? foste p onde?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois eu faria isso com um script php para importar dados o problema é que a tão depressa tinhas uns dados e outros não e era uma confusão pegada...

Com isto consegui resolver ;)

Eu estou neste ano ainda no 12º ano só neste ano é que me vou candidatar mas de qualquer forma o meu objectivo continua a ser LEEC @ IST ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois eu faria isso com um script php para importar dados o problema é que a tão depressa tinhas uns dados e outros não e era uma confusão pegada...

Com isto consegui resolver :D

Eu estou neste ano ainda no 12º ano só neste ano é que me vou candidatar mas de qualquer forma o meu objectivo continua a ser LEEC @ IST :D

facilmente resolves esse problema com o uso de indices "unique" do mysql.

Para te orientares melhor podes sempre mandar um report da operação para o output.

LEEC @ IST, boa escolha. No entanto mal estavamos se eu nao puxasee a brasa à minha sardinha. O IST tem a reputação que todos sabemos e eu sou o premeiro a dar-lhe crédito. No entanto o sucesso profissional não é tudo na vida. Já disse isto aqui no fórum, estou a acabar a minha passagem por coimbra na condição de estudante, académicamente pode ter sido mau ou bom, em termos pessoais é uma experiencia espectacular e única.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora