Jump to content

Programa C tratar dados .csv


Recommended Posts

Posted

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.

Posted

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!

Posted

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

Posted (edited)

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);
Edited by 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!

Posted

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

Posted

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!

Posted

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.

Posted

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
Posted (edited)

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);
Edited by 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!

Posted

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.

Posted (edited)

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);
Edited by 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!

Posted

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...

Posted

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.

Posted

... 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!

Posted

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.

Posted (edited)

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.

Edited by 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!

Posted

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.

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.