Ir para o conteúdo
Psycho_Mind

Programa C tratar dados .csv

Mensagens Recomendadas

Psycho_Mind

Boas.

Tenho um programa que captura dos pacotes na rede, sendo criado um ficheiro .txt com os dados da captura efetuada. Como preciso de tratar as estatisticas dos dados a melhor forma (penso eu de que) passaria por passar os dados do ficheiro .txt para um .csv. o problema agora é saber qual a melhor forma de o fazer... Não sei como deveria de proceder para implementar um programa que permita fazer isto. Talvez o melhor seja adicionar "," (virgulas) entre os dados obtidos e guardar estes dados. Mas não estou a ver como o possa fazer... Guardar numa string ou assim.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Podes fazer isso facilmente (é o chamado filtro Unix).

Mas, dependendo do que queres fazer com os dados, talvez seja desnecessario: o Excel, por exemplo, interpreta tao bem um ficheiro CSV como um ficheiro TXT de fixed width.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycho_Mind

Podes fazer isso facilmente (é o chamado filtro Unix).

Mas, dependendo do que queres fazer com os dados, talvez seja desnecessario: o Excel, por exemplo, interpreta tao bem um ficheiro CSV como um ficheiro TXT de fixed width.

Vários tipos de estatisticas sobre os pacotes capturados e pensei que um ficheiro .csv pudesse ser uma forma mais simples para o fazer, mas tendo em conta que tenho o programa a criar um .txt com os dados tenho de ter forma de os ter num .csv

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Se o ficheiro origem for "fixed width" a forma mais pratica, a meu ver, é ir passando bytes do source para o destino, acrescentando a virgula (e aspas), onde necessario:

FILE *src = fopen("origem.txt", "r");
FILE *dst = fopen("destino.csv", "w");
int count = 0;
int ch;

while ((ch = fgetc(src)) != EOF) {
   count += 1;
   if (count == 5) fputc(',', dst);  // acrescenta virgula
   if (count == 8) fputc(',', dst);
   if (count == 13) fputc(',', dst);
   if (count == 16) fputc(',', dst);
   if (count == 42) fputc(',', dst);
   if (count == 63) count = 0;       // outra linha
   fputc(ch, dst);
}
fclose(src);
fclose(dst);

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycho_Mind

Se o ficheiro origem for "fixed width" a forma mais pratica, a meu ver, é ir passando bytes do source para o destino, acrescentando a virgula (e aspas), onde necessario:

FILE *src = fopen("origem.txt", "r");
FILE *dst = fopen("destino.csv", "w");
int count = 0;
int ch;

while ((ch = fgetc(src)) != EOF) {
count += 1;
if (count == 5) fputc(',', dst);  // acrescenta virgula
if (count == 8) fputc(',', dst);
if (count == 13) fputc(',', dst);
if (count == 16) fputc(',', dst);
if (count == 42) fputc(',', dst);
if (count == 63) count = 0;	   // outra linha
fputc(ch, dst);
}
fclose(src);
fclose(dst);

Percebi a tua ideia, tinha era pensado em fazer informação, informação, informação /fim de linha/ informação, informação... e o ficheiro que é criado vir logo com a informação desta forma para utilizar o .csv

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Ahhhhh, podes alterar o programa que captura dos pacotes na rede?

Então claro: em vez do programa criar TXT não estruturado, altera-o para ele criar CSVs!


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycho_Mind

Ahhhhh, podes alterar o programa que captura dos pacotes na rede?

Então claro: em vez do programa criar TXT não estruturado, altera-o para ele criar CSVs!

Sim, sim, posso. O que tinha pensado era manter o programa a produzir o ficheiro .txt com a info dos pacotes produzidos e depois ter tambem a dar um outro ficheiro mas para o .csv, pois so preciso msm deste e para poder tratar as estatisticas dos dados. Assim para este estava a pensar em fazer algo como introduzir entre os dados d1,d2,d3, \n e assim sucessivamente, mas para ter o programa a dar o .txt como esta, mais este novo com as virgulas, teria de ter isto a fazer algo como que a passar para uma String ou assim, s+= "," + "nova string". Aqui é que está a minha principal duvida, qual a melhor forma de o fazer, até porque sendo isto em C as string não sei até que ponto funcionariam.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

se as strings tiverem tamanho máximo, podes fazer:

// tamanho máximo de uma entrada em caracters
#define ELEMENT_SIZE 100
// numero de entradas por linha (exemplo para 4)
#define ELEMENT_COUNT 4

// tamanho maximo necessario para guardar uma linha
// ASPAS + STRING + ASPAS [VIRGULA + ...] FIM_DE_LINHA
#define STRING_SIZE ((ELEMENT_SIZE + 2) * ELEMENT_COUNT + ELEMENT_COUNT)

int main() {
 // ...
 char * ent1, * ent2, * ent3, * ent4;
 char linha[sTRING_SIZE];

 sprintf(linha, "\"%s\",\"%s\",\"%s\",\"%s\"\n", ent1, ent2, ent3, ent4);

 // gravar a string "linha" no ficheiro

 // ...
}


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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Onde tens

fprintf(txtfile, "%d - %s - %d, %d, %d\n", n, code, a, b, c);

Passas a ter

fprintf(txtfile, "%04d - %20s - %4d, %4d, %4d\n", n, code, a, b, c);
fprintf(csvfile, "%d,"%s",%d,%d,%d\n", n, code, a, b, c);

Editado por pmg
GeSHi

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycho_Mind

Ora viva...

As vossas dicas ajudaram e muito, já consegui ter isto a funcinar como pretendido.

Vinha agora com uma questão semelhante mas para html. O meu intuito é ter os resultados dos pacotes apresentados em tabelas para poder depois formatar as mesmas mais facilmente e ter outro tipo de formatação, mas aqui não faço mesmo a minima ideia de como o fazer utilizando o código C que tenho. Neste caso sei como funciona uma tabela em HTML, até é bastante simples, não sei é como conseguir integrar a mesma com os pacotes capturados.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Sem contar com as dificuldades (ligeiras) do principio e fim da tabela, fazes como a alteração do TXT para CSV.

No principio de cada linha metes "<tr><td>"; entre cada elemento metes "</td><td>"; e no fim de cada linha metes "</td></tr>".

Mais ou menos assim

fprintf(htmlfile, "<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td><td>%d</td></tr>", n, code, a, b, c);

Editado por pmg
codigo exemplo

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycho_Mind

Sem contar com as dificuldades (ligeiras) do principio e fim da tabela, fazes como a alteração do TXT para CSV.

No principio de cada linha metes "<tr><td>"; entre cada elemento metes "</td><td>"; e no fim de cada linha metes "</td></tr>".

Mais ou menos assim

fprintf(htmlfile, "<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td><td>%d</td></tr>", n, code, a, b, c);

Pois... Mas ele da-me erros referentes às expressões que estou a utilizar. Isto precisa de algum tipo de import ou basta ter os dados entre:

<html>

<table>

fprintf(htmlfile, "<tr><td>%d</td><td>%s</td><td>%d</td><td>%d</td><td>%d</td></tr>", n, code, a, b, c);

...

Por certo terei de ter outros atributos porque ter isto ali no meio do C...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycho_Mind

estás a meter código C no meio de HTML ?

Não HTML no C :)

Por isso as minhas duvidas de como integrar o HTML no C.

HTML no código C que tenho para ter os resultados num ficheiro .html

Por isso as minhas duvidas de como integrar o HTML no C.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

... ele da-me erros ...

Quais erros?

Quem é "ele"?

Ou estás a escrever um programa em C e "ele" é o compilador e os erros são erros de sintaxe (não podes ter duas linguagens 'activas' no mesmo ficheiro source) ou não sei.

O que é que queres?

Queres alterar o programa que já fizeste e que cria ficheiros TXT, ficheiros CSV, etc?

Queres fazer outro programa (em C?) que usa os ficheiros produzidos pelo teu primeiro programa?


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycho_Mind

Quais erros?

Quem é "ele"?

Ou estás a escrever um programa em C e "ele" é o compilador e os erros são erros de sintaxe (não podes ter duas linguagens 'activas' no mesmo ficheiro source) ou não sei.

O que é que queres?

Queres alterar o programa que já fizeste e que cria ficheiros TXT, ficheiros CSV, etc?

Queres fazer outro programa (em C?) que usa os ficheiros produzidos pelo teu primeiro programa?

Tenho o tal ficheiro C a fazer as capturas para o qual me dá um file .txt e agora o novo .csv como tinhamos visto. Agora queria ver se conseguia ter também esses resultados apresentados em tabelas HTML. Claro que utilizando o código C que faz as capturas como anteriormente.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pmg

Então tens que resolver as "dificuldades (ligeiras)" do principio e fim da tabela com C.

fprintf(htmlfile, "<!doctype html><html><head>...</head><body><table>");
/* codigo em loop para cada linha */
fprintf(htmlfile, "</table></body></html>\n");

E no fim do programa, aparentemente, ficas com 3 ficheiros: um TXT, um CSV, e um HTML.

Editado por pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Psycho_Mind

Então tens que resolver as "dificuldades (ligeiras)" do principio e fim da tabela com C.

fprintf(htmlfile, "<!doctype html><html><head>...</head><body><table>");
/* codigo em loop para cada linha */
fprintf(htmlfile, "</table></body></html>\n");

E no fim do programa, aparentemente, ficas com 3 ficheiros: um TXT, um CSV, e um HTML.

Acho que já consegui... Não estava a estruturar a coisa corretamente. Deixa ver se consigo tratar todos os dados para ver se resulta corretamente.

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.