QuickFire Posted October 22, 2006 at 10:26 AM Report #59260 Posted October 22, 2006 at 10:26 AM 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 🙂
mota77 Posted October 22, 2006 at 02:27 PM Report #59408 Posted October 22, 2006 at 02:27 PM 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?
karva Posted October 22, 2006 at 02:49 PM Report #59413 Posted October 22, 2006 at 02:49 PM @mota77 $texto = "xpto"; $query = "SELECT * FROM tabela WHERE texto LIKE '%$texto%'"; mysql_query($query); Proud LEIC-A@IST student!
kingless Posted October 22, 2006 at 02:54 PM Report #59414 Posted October 22, 2006 at 02:54 PM 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 ?
mota77 Posted October 22, 2006 at 03:40 PM Report #59421 Posted October 22, 2006 at 03:40 PM karva obrigado eu ja tinha testado o Like mas já nao me lembrava
shumy Posted October 22, 2006 at 03:53 PM Report #59423 Posted October 22, 2006 at 03:53 PM para ai com funções de regular expression. Aqui há coisa de 2 anos fazia umas malhas de croché, depois fartei-me e fui para informática!
QuickFire Posted October 22, 2006 at 06:02 PM Author Report #59467 Posted October 22, 2006 at 06:02 PM 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 :\
kingless Posted October 22, 2006 at 06:52 PM Report #59482 Posted October 22, 2006 at 06:52 PM É 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)
-IceBurn- Posted October 23, 2006 at 09:43 AM Report #59590 Posted October 23, 2006 at 09:43 AM 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.
QuickFire Posted October 23, 2006 at 06:12 PM Author Report #59639 Posted October 23, 2006 at 06:12 PM 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 😁 Dou-te os parabéns porque o código está muito bem documentado 😛
karva Posted October 23, 2006 at 06:34 PM Report #59644 Posted October 23, 2006 at 06:34 PM mt bom o script. poe no armazem de codigo Proud LEIC-A@IST student!
QuickFire Posted October 24, 2006 at 04:25 PM Author Report #59808 Posted October 24, 2006 at 04:25 PM 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 😄 Parece complicado mas tenho estado a pensar nisto e não consigo encontrar solução 🙂 Thanks
-IceBurn- Posted October 24, 2006 at 05:50 PM Report #59821 Posted October 24, 2006 at 05:50 PM 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.
pedrotuga Posted October 24, 2006 at 06:11 PM Report #59824 Posted October 24, 2006 at 06:11 PM ???? 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.
QuickFire Posted October 24, 2006 at 06:29 PM Author Report #59831 Posted October 24, 2006 at 06:29 PM 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
QuickFire Posted October 24, 2006 at 09:58 PM Author Report #59882 Posted October 24, 2006 at 09:58 PM 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 😄 O Excel tratou das formatações todas graficamente e depois foi só importar com o Navicat 😄 Tava a ver que nunca mais acabava 🙂
pedrotuga Posted October 25, 2006 at 06:51 PM Report #60048 Posted October 25, 2006 at 06:51 PM 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?
QuickFire Posted October 25, 2006 at 07:08 PM Author Report #60055 Posted October 25, 2006 at 07:08 PM 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 😉
pedrotuga Posted October 27, 2006 at 06:33 AM Report #60325 Posted October 27, 2006 at 06:33 AM 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 😄 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.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now