Ir para o conteúdo
PsySc0rpi0n

Procurar string dentro de um file .txt

Mensagens Recomendadas

PsySc0rpi0n

Boas...

Depois das últimas dúvidas esclarecidas, queria agora tentar fazer outra coisa.

Eu tenho um ficheiro .txt que é gerado por um outro programa e preciso de "entrar" nesse ficheiro, procurar por uma determinada palavra e guardar a posição dessa palavra no ficheiro.

Por posição da palavra no ficheiro eu pretendo dizer por exemplo, das duas uma:

a palavra "xxx" está na linha 'y'

ou então

a palavra "xxx" está na localização para onde o ponteiro para o ficheiro está a apontar, acho eu. Pois o ponteiro para o ficheiro é incrementado quando usado com algumas funções.

Mas ainda não consegui pensar num método para fazer isto nem tão pouco qual destes dois métodos será o melhor ou se haverá outro mais fácil/intuitivo.

Se calhar é melhor fazer upload do conteúdo do file e dizer o que pretendo fazer do início ao fim.

Muito resumidamente, tenho um programa que cria um file .txt com uma tabela com alguns valores. A tabela tem meia dúzia de linhas e mais de uma dezena de colunas e queria tentar extrair os dados dessa tabela, incluindo os cabeçalhos das colunas e das linhas e carregá-los em memória. Depois de tudo o que não interessa ter sido descartado, queria escrever os dados aproveitados num file .csv, onde os dados são escritos separados por vírgulas para formarem uma tabela. Depois disto feito, eu, em teoria, podia abrir o file em Excel e obter uma tabela como a que o file .txt tinha mas sem a informação descartada.

Link para file .txt

http://ideone.com/4RxWaj

O output do site está todo estragado mas acho que se copiarem o conteúdo para dentro de um file .txt fica a tabela direita e formatada.

Acham areia de mais para a minha camioneta?

Editado por PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Bom, como ainda não obtive respostas, vou dizer o que estava a tentar fazer.

-abrir o ficheiro .txt

-obter o número de caractéres de uma linha

-ler palavra a palavra com o fgets

-comparar a posição actual do ponteiro para o ficheiro com o mesmo ponteiro + o número de caractéres da linha. Se fossem iguais significava que o ponteiro para o ficheiro estava no final da linha e incrementava uma variável para saber que tinha acabado de chegar ao fim de uma linha.

-comparar a palavra obtida com o fgets com uma string já definida previamente. Se fossem iguais, guardava a string numa variável.

Entretanto tinha que arranjar forma de guardar as posições das palavras/números porque depois precisava de as relacionar mais tarde.

Mas não sei se isto é viável.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Bom, parece que isto talvez seja mais simples que o que parece. Vou tentar ler caractér a caractér e substituir os pontos e vírgula por vírgulas e ignorar os espaços. Tudo o resto é escrito caractér a caractér... A ver se isto dá alguma coisa.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Pronto, já obtive alguns resultados mas ainda não é o esperado.

A ideia foi ler caractér a caractér e quando encontrasse um ';', substituía por uma ','.

Mas por alguma razão, a função textTocsvConverter está a escrever a vírgula duas vezes seguidas, não sei porquê.

Vou deixar aqui o link para o ficheiro de texto que depois é suposto converter para csv. Tem que se copiar o conteúdo mesmo para dentro de um file txt para se poder ver o conteúdo direitinho, porque ao fazer o upload do file, aquilo fica tudo estragado.

http://ideone.com/4RxWaj

E o meu code é :

http://ideone.com/bv73pI

A função em causa é a tal textTocsvConverter...


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

desculpa não olhar para o teu código, só olhei para o post inicial e fiz isto

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define BUFFER_SIZE 1024
#define INPUT_VALUE_SEPERATOR ";"
#define OUTPUT_VALUE_SEPERATOR ','
#define OUTPUT_STRING_DELIMITER '"'

char* ltrim(char* str);
char* rtrim(char* str);
char*  trim(char* str);

int main(int argc, char** argv)
{
   FILE *ifd, *ofd;

   char value_seperator = OUTPUT_VALUE_SEPERATOR;
   char string_delimiter = OUTPUT_STRING_DELIMITER;

   if (argc < 3)
   {
       printf("tbl2csv <input file> <output file> [<value seperator> <string delimiter>]\n");
       exit(-1);
   }

   if ((ifd = fopen(argv[1], "r")) == NULL)
   {
       printf("Error : unable to open the input file : %s\n", argv[1]);
       exit(-2);
   }

   if ((ofd = fopen(argv[2], "w")) == NULL)
   {
       fclose(ifd);

       printf("Error : unable to open the output file : %s\n", argv[1]);
       exit(-2);
   }

   if (argc > 3)
   {
       value_seperator = argv[3][0];
   }

   if (argc > 4)
   {
       string_delimiter = argv[4][0];
   }

   size_t line = 0;
   char buffer[bUFFER_SIZE];
   while (fgets(buffer, BUFFER_SIZE, ifd))
   {
       if (strstr(buffer, INPUT_VALUE_SEPERATOR) != NULL) {
           int add_seperator = 0;
           char* tok = strtok(buffer, INPUT_VALUE_SEPERATOR);
           while (tok)
           {
               char* value = trim(tok);
               if (value[0] != '\0')
               {
                   if (add_seperator)
                   {
                       fprintf(ofd, "%c", value_seperator);
                   }
                   add_seperator = 1;

                   fprintf(ofd, "%c%s%c", string_delimiter, value, string_delimiter);
               }
               tok = strtok(NULL, INPUT_VALUE_SEPERATOR);
           }

           fprintf(ofd, "\n");
       }
   }

   fclose(ifd);
   fclose(ofd);

   return 0;
}

char* ltrim(char* str)
{
   while (*str && isspace(*str))
       str++;
   return str;
}

char* rtrim(char* str)
{
   size_t strlength = strlen(str);
   while (strlength && isspace(str[strlength - 1]))
   {
       str[strlength - 1] = '\0';
       strlength--;
   }
   return str;
}

char* trim(char* str)
{
   return rtrim(ltrim(str));
}

Editado por HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Testei o teu code e também está a colocar as vírgulas duplicadas.. Acho eu.


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

Estranho, eu tentei algumas vezes e ele colocou sempre duas vírgulas no lugar onde estavam os pontos e vírgula... Terá alguma coisa a ver com o facto de eu ter testado num PC com Windows?


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

Estranho, eu tentei algumas vezes e ele colocou sempre duas vírgulas no lugar onde estavam os pontos e vírgula... Terá alguma coisa a ver com o facto de eu ter testado num PC com Windows?

não, eu acho que o problema é estares a fer no ficheiro de output.txt errado, ou não estás a fazer refresh deste após a execução da aplicação


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

não, eu acho que o problema é estares a fer no ficheiro de output.txt errado, ou não estás a fazer refresh deste após a execução da aplicação

Quando executas o teu programa, envias 2, 3 ou 4 parâmetros pela consola?

Eu experimentei:

./txttocsv <path_to_input_file.txt> <path_to_input_file.csv> ; ,

./txttocsv <path_to_input_file.txt> <path_to_input_file.csv> , ;

./txttocsv <path_to_input_file.txt> <path_to_input_file.csv>

E todos me deram o mesmo resultado!

Edited;

Acabei de testar no meu Linux... Tive que adicionar o ctype.h mas a conversão já correu bem! Agora resta saber se o file gerado produz o efeito desejado no excel!


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
PsySc0rpi0n

No meu PC do work que tem Windows o resultado é:

palavra,;,

No meu PC de casa que tem Linux o resultado é:

"palavra";


Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.