任务
虽然数据处理拥有多种便捷语言支持,但课设需要使用c语言实现,因此学习如何将excel表格信息导入程序中进行处理
所需
- c语言运行平台
- 数据表格
步骤
1.查阅发现,通过处理csv(comma separated-values)文件,在python学习时接触到,为逗号分隔的文本格式,可以被和文本文件相同方式处理。
2.将表格另存为csv格式。
3.读入文件
FILE* fp;
fp = fopen("oneturntask.csv", "r");
4.目标为写一个读文件的模板,可以通过修改简单的参数,灵活读入不同文件的数据,方便多次使用
- 读入表头信息
#define HEADERMAXLEN 100 //表头最大字符总长
#define TITLEMAXLEN 100 //单个标题最大字符长度
#define TITLEMAXNUM 20 //标题最大数量
int colNum=0;//记录表格数据总列数
int lineCodeCol, leaveTimeCol, directionCol, actualTimeCol;//记录需要的数据所在列数
char csvHeader[HEADERMAXLEN];//存储表头信息
char title[TITLEMAXNUM][TITLEMAXLEN];//存储各个标题
int lineData[TITLEMAXNUM];//读入数据
int readAll = 0;//判断是否到文件结尾
char* pHeader;
char* pTitle;
fscanf(fp, "%s", &csvHeader);//读入表头信息
//cout << "表头全部信息如下:" << csvHeader << endl;
for (pHeader = csvHeader; *pHeader != '\0'; pHeader++)
{
colNum++;//空出0号存储位置,与实际列数相一致
pTitle = title[colNum];
while (*pHeader != ',' && *pHeader != '\0')
{
*pTitle++ = *pHeader++;
}
*pTitle = '\0';
// cout << "第"<<colNum<<"列:"<<title[colNum] << endl;
if (*pHeader == '\0')//读到表头末尾退出循环
break;
}
//cout << "共有数据:" << colNum << "列" << endl;
- 定位所需数据
#define LINECODE "LineCode"
#define LEAVETIME "LeaveTime0"
#define ACTUALTIME "ActualTime"
#define DIRECTION "WorkDirection"//表头关键字预定义
for (int i = 1; i <= colNum; i++)
{
if (strcmp(title[i], LINECODE) == 0)
{
lineCodeCol = i;
//cout << "所需" << LINECODE << "位于第" << i << "列" << endl;
}
if (strcmp(title[i], LEAVETIME) == 0)
{
leaveTimeCol = i;
//cout << "所需" << LEAVETIME << "位于第" << i << "列" << endl;
}
if (strcmp(title[i], DIRECTION) == 0)
{
directionCol = i;
//cout << "所需" << DIRECTION << "位于第" << i << "列" << endl;
}
if (strcmp(title[i], ACTUALTIME) == 0)
{
actualTimeCol = i;
//cout << "所需" << ACTUALTIME << "位于第" << i << "列" << endl;
}
- 读入所需数据
while (readAll==0)
{
for (int i = 1; i <= colNum; i++)
{
if (fscanf(fp, "%d", &lineData[i]) == EOF)//判断读到文件末尾
{
readAll = 1;
break;
}
fgetc(fp);
}
//打印文件信息
/*
if (readAll == 0)
{
for (int i = 1; i <= colNum; i++)
{
if (i == lineCodeCol)
cout << "lineCode:" << lineData[i] << " ";
if (i == leaveTimeCol)
cout << "leaveTime:" << lineData[i] << " ";
if (i == actualTimeCol)
cout << "actualTime:" << lineData[i] << " ";
if (i == directionCol)
cout << "direction:" << lineData[i] << " ";
}
}
*/
}
5.能够对文件信息在读取后进行处理,关闭文件
fclose(fp);
结果验证
写在后面
想读取其他文件做调整时发现,可移植性并不优秀,面对表格中的字符数据处理显出无力,只能手动删除所有包含字符单元列进行测试。
优化想法:
对单元格的读取函数做封装:一次读取一个单元格全部内容至字符数组保存,之后再进行处理。