每场钉钉直播都可以导出数据,记录着直播总时长与观看的人员及时长和未观看的人员,接下来的介绍是针对多个导出的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();
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;
}
具体数据涉及到他人隐私,此处没有给出具体过程