[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OFF TOPIC] Preciso de uma ajuda e nao sei definir o assunto. Sei que é fora do topico



Marcelo Luiz de Laia escreveu:
Olá,

Como a mensagem chegou a lista desformatada, eu coloquei um exemplo em pdf neste endereco:

http://200.145.102.65:9102/exemplo.pdf

Colocar todos os "iguais" um abaixo do outro eu ate ja tinha obtido. O passo seguinte que é o mais trabalhoso, uma vez que eu estou fazendo manualmente desde ontem e nao fiz nem um terco.

Agora que estao todos agrupados, eu preciso deixar uma unica linha por ID e indicar em qual das cinco ultimas colunas ele esta presente. Note que um dado ID pode estar presente somente em X12 (caso do aaaa), ou em X24 e P5 (caso do tttt), ou em X24, P24, P3 e P5 (caso do bbbb), ou ainda, nao exemplificado, em todas as cinco.

Entao, eu preciso que a esses IDs estejam em uma unica linha e com os respectivos X na coluna onde eles aparecem. As colunas do meio (estao vazias no exemplo) nao sao necessarias e nao precisam ser levadas em consideracao. Podem ate serem descartadas.

Sei que a lista é uma colaboracao voluntaria e sem fins lucrativos, mas, para quem me ajudar eu mandarei umas cervejas como demosntracao de agradecimento, pois sei que estou fora do topico da lista. Tambem peco a compreensao dos demais membros.

Muito obrigado

Marcelo

Olá colega Marcelo,

Não gosto de ver pessoas necessitadas, então resolvi usar alguns intervalos e ajudar:

- Para um arquivo onde os IDs iguais são adjacentes, desconsiderando cabeçalho e terminado com um '\n' em todas as linhas:

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

int main(int argc, char* argv[]){
 FILE *arquivo;
 char *conteudo, *inicio/*linha*/, *fim/*linha*/;
 char *id, *id_antigo, *colunas, x12, x24, p24, p3, p5;
 int i;
 arquivo = fopen(argv[1], "r");
 fseek(arquivo, 0, SEEK_END);
 i = ftell(arquivo);
 fseek(arquivo, 0, SEEK_SET);
 conteudo = (char*)malloc(i+1);
 fread(conteudo, i, 1, arquivo);
 conteudo[i] = '\0';
 fclose(arquivo);
 // printf("Arquivo:\n\n\n%s\n\n", conteudo);
 inicio = conteudo;
 fim = strchr(inicio, '\n');
 inicio = fim+1;               //  Pular o cabeçalho
 fim = strchr(inicio, '\n');   //  Pular o cabeçalho
 id_antigo = inicio;
 x12 = x24 = p24 = p3 = p5 = ' ';
 while (fim){
   *fim = '\0';
   id = inicio;
   inicio = strchr(id, '\t'); // fim do id
   *(inicio++) = '\0';
   if (strcmp(id, id_antigo)){ // se mudou o ID
printf("%s\t%s\t%c\t%c\t%c\t%c\t%c\n", id_antigo, colunas, x12, x24, p24, p3, p5);
     x12 = x24 = p24 = p3 = p5 = ' ';
   }
   colunas = inicio;
   inicio = strchr(inicio, '\t')+1; // fim do nome
   inicio = strchr(inicio, '\t')+1; // fim do logFC
   inicio = strchr(inicio, '\t')+1; //  "  "  A
   inicio = strchr(inicio, '\t')+1; //  "  "  t
   inicio = strchr(inicio, '\t')+1; //  "  "  P
   inicio = strchr(inicio, '\t')+1; //  "  "  PV
   inicio = strchr(inicio, '\t'); //  "  "  B
   *inicio = '\0';
   x12 = (*(++inicio) != 'x' && x12 != 'x' ? ' ' : 'x');
   inicio = strchr(inicio, '\t'); //  "  "  X12
   x24 = (*(++inicio) != 'x' && x24 != 'x' ? ' ' : 'x');
   inicio = strchr(inicio, '\t'); //  "  "  X24
   p24 = (*(++inicio) != 'x' && p24 != 'x' ? ' ' : 'x');
   inicio = strchr(inicio, '\t'); //  "  "  P24
   p3  = (*(++inicio) != 'x' && p3  != 'x' ? ' ' : 'x');
   inicio = strchr(inicio, '\t'); //  "  "  P3
   p5  = (*(++inicio) != 'x' && p5  != 'x' ? ' ' : 'x');
   inicio = fim + 1;
   id_antigo = id;
   fim = strchr(inicio, '\n');
 }
printf("%s\t%s\t%c\t%c\t%c\t%c\t%c\n", id_antigo, colunas, x12, x24, p24, p3, p5);
 return 0;
}
-------------------------------------------------------------------------

$ gcc -Wall cevas.c -o cervejas && ./cevas arquivo.txt

Arquivo testado:
______________________________________________

ID Nome logFC A t P PV B X12 X24 P24 P3 P5 12 aaaa -1 3 -1 0 0 1 x _ _ _ _ 45 bbbb 2 4 -2 0 0 1 _ _ _ x _ 45 bbbb 2 4 -2 0 0 1 _ x _ _ _ 45 bbbb 2 4 -2 0 0 1 _ _ x _ _ 45 bbbb 2 4 -2 0 0 1 _ _ _ _ x 56 tttt 0.5 2 -3 0 0 1 _ x _ _ _ 56 tttt 0.5 2 -3 0 0 1 _ _ _ _ x 67 hhhh 0.6 1 0 0 0 1 x _ _ _ _ 67 hhhh 0.6 1 0 0 0 1 _ x _ _ _ 01 eeee 3 5 -3 0 0 1 _ _ x _ _ 03 uuuu 4 6 -4 0 0 1 _ _ _ _ x 98 zzzz 5 7 -5 0 0 1 x _ _ _ _ 98 zzzz 5 7 -5 0 0 1 _ _ x _ _ 98 zzzz 5 7 -5 0 0 1 _ _ _ x _ 98 zzzz 5 7 -5 0 0 1 _ _ _ _ x
______________________________________________

Resultado:
______________________________________________

12 aaaa -1 3 -1 0 0 1 x _ _ _ _ 45 bbbb 2 4 -2 0 0 1 _ x x x x 56 tttt 0.5 2 -3 0 0 1 _ x _ _ x 67 hhhh 0.6 1 0 0 0 1 x x _ _ _ 01 eeee 3 5 -3 0 0 1 _ _ x _ _ 03 uuuu 4 6 -4 0 0 1 _ _ _ _ x 98 zzzz 5 7 -5 0 0 1 x _ x x x
______________________________________________

Observe que o '_' no lugar do vazio é apenas para visualizar melhor, mas funciona legal com eles também. Repare que existe diferença entre 'X' (maiúsculo) e 'x' (minúsculo).

Aguardo minhas cevas! ;)

--
Atenciosamente,

          Junior Polegato

          Um peregrino de problemas; Um pergaminho de soluções!
          Página Profissional: http://www.juniorpolegato.com.br



Reply to: