钉钉直播导出观看时长数据统计(c语言)

    技术2022-07-12  77

    每场钉钉直播都可以导出数据,记录着直播总时长与观看的人员及时长和未观看的人员,接下来的介绍是针对多个导出的Excel文件进行总数据收集。

    csv格式:

    Excel中文件会以文本形式一行行显示,单元格之间转换为逗号

    从钉钉导出的数据为.xls格式,这里我们需要打开.xls表格并另存为.csv格式,我们采用一行行读取数据 思路如下:

    1)提取总时长

    根据钉钉导出数据的格式,参考转化后的.csv格式文件的内容,用文本文件打开转格式后的.csv文件,很容易知道,在csv中第五行第四个逗号后面的内容即为本场直播的总时长,格式为固定的 hh:mm:ss,我们以分钟为单位提取出来

    2)提取观看者及观看时长

    观察csv文件,也易知第九行为第一个学生的名字,第一个逗号为观看者的姓名,第二个逗号后面为观看者观看的时长,时长分为两种: 1.xx小时xx分钟 2.xx分钟 用分支语句以两种方式提取 然后继续读取下一行,即下一个观看者的数据

    3)提取未观看者的信息

    观察csv文件,易知在未观看学生一行的上面有固定两行逗号 未观看学生一行下面的信息有两种情况 1.有未观看者,即在下面出现未观看者的信息,提取第一个逗号前的名字,继续读取下一个行,遇到一行逗号截止 2.无未观看者,即在下行就只有一行逗号

    使用方法

    按1输入你的csv文件名,会输出当前文件的观看信息,即截止目前(即前面输入的所有文档数据)的总观看数据, 按2输出总观看数据 按3输出到Excel表格中 这里记住都要与生成的.exe程序放在同一个目录下:

    源码附录:

    #include <stdio.h> #include <stdlib.h> #include <string.h> struct Mess { char name[50]; int time;//分钟为单位 int all; }mess[1000]; int Mess_SearchByIndex(int id);//查找姓名 void Mess_Display();//输出截止目前观看者的信息 void Mess_out();//将截止目前汇总的信息导入Excel文件中 void IO_ReadInfo();//读出文件 void IO_WriteInfo();//读入文件 int num=0; int Mess_SearchByIndex(char *a) { int i; for (i=0;i<num;i++) { if (strcmp(a,mess[i].name)==0) { return i; } } strcpy(mess[num].name,a); mess[num].time=0; mess[num].all=0; num++; return num-1; } void Mess_Insert() { FILE *fp; int time1=0; char da[100]; char filename[100]; printf("请输入你的csv文件名:\n"); scanf("%s",filename); fp=fopen(filename,"r"); if(!fp) printf("shibai"); int timeall=0; int count=0; for(int i=0;i<=7;i++) { fscanf(fp,"%s",da); if(i==4) { int j=i; while(1) { j++; if(da[j]==',') count++; if(count==4) { timeall=(da[j+2]-'0')*60+(da[j+4]-'0')*10+da[j+5]-'0'; break; } } } } while(1) { fscanf(fp,"%s",da); int time1=0; char name1[5]=""; int i=0,flag=1; if(strcmp(da,",,,,,,,,,,")==0)//记录未观看同学的 { fscanf(fp,"%s",da); fscanf(fp,"%s",da); L2: fscanf(fp,"%s",da); if(strcmp(da,",,,,,,,,,,")!=0) { int i=0; while(1) { i++; if(da[i]==',') { strncpy(name1,da,i); printf("%s 0\n",name1); int k= Mess_SearchByIndex(name1); mess[k].time+=0; break; } } goto L2;//继续读入下一行 } break; } while(1) { if(da[i]==','&&flag) { strncpy(name1,da,i); printf("%s",name1); flag++; } i++; if(da[i]==','&&flag==2) { if(da[i+8]==',')//只有分钟 { i++; do{ time1=time1*10+da[i]-'0'; i++; }while(da[i]>='0'&&da[i]<='9'); } else//有小时和分钟 { i++; int k=(da[i]-'0')*60; i+=5; do{ time1=time1*10+da[i]-'0'; i++; }while(da[i]>='0'&&da[i]<='9'); time1+=k; } printf(" %d\n",time1); goto L1; } } L1:{ int k= Mess_SearchByIndex(name1); mess[k].time+=time1; } } for(int i=0;i<num;i++) { mess[i].all+=timeall; } fclose(fp); } void Mess_Display() { int i; while(1) { for(int i=0;i<num;i++) { printf("%-8s 总观看时间:=分钟 总时间:%d\n",mess[i].name,mess[i].time,mess[i].all); } break; } } void Mess_out() { int i; printf("请输入你要导出的Excel文件名:\n"); char a[50]; scanf("%s",a); FILE *fq; fq=fopen(a,"w"); while(1) { for(int i=0;i<num;i++) { fprintf(fq,"%-8s\t 总观看时间: \t %d分钟\t 总时间:\t%d \n",mess[i].name,mess[i].time,mess[i].all); } break; } fclose(fq); } void IO_ReadInfo() { FILE *fp; int i; if ((fp=fopen("c:\\message.txt","rb"))==NULL) { printf("不能打开文件!\n"); return; } fread(&num,sizeof(int),1,fp); for(i=0;i<num;i++) { fread(&mess[i],sizeof(struct Mess),1,fp); } fclose(fp); } void IO_WriteInfo() { FILE *fp; int i; if ((fp=fopen("c:\\message.txt","wb"))==NULL) { printf("不能打开文件!\n"); return; } if (fwrite(&num,sizeof(int),1,fp)!=1) { printf("写入文件错误!\n"); } for (i=0;i<num;i++) { if (fwrite(&mess[i],sizeof(struct Mess),1,fp)!=1) { printf("写入文件错误!\n"); } } fclose(fp); } int main() { int choice; IO_ReadInfo(); while(1) { /*主菜单*/ printf("\n------ 学习计时系统------\n"); printf("1. 学生观看信息录入\n"); printf("2. 学生观看信息输出\n"); printf("3. 导出Excel文件\n"); printf("4. 退出\n"); printf("请选择(1-4):"); scanf("%d",&choice); getchar(); switch(choice) { case 1: Mess_Insert(); case 2: Mess_Display(); break; case 3: Mess_out(); break; case 4: return 0; } IO_WriteInfo(); } return 0; }

    具体数据涉及到他人隐私,此处没有给出具体过程

    Processed: 0.013, SQL: 10