一、问题引入
在使用不背单词记单词时,发现它缺少了取词的功能,而我平时都是使用欧陆词典取词和查找单词。
这时,我想将平时提取的生词本上传到不背单词的生词本,这样就可以把陌生单词加入复习计划,然而它所支持上传的文件和格式是限制的。不能直接将 欧陆词典 导出的文件直接导入到 不背单词,需要将文件内容格式化。
而我需要做的就是将文件格式化操作,后续经常会有导入生词本的操作,以及可以分享给其他有此需求的人。编写一个由C语言写的小程序,解决该问题。
二、解决过程
解决过程的流程描述:欧陆词典生词本 --> a file.csv --> 格式化 a_file.csv to b_file.txt --> 不背单词生词本
。重点在格式化 a_file.csv to b_file.txt,其他步骤不作详细说明。
1️⃣ 观察和分析a_file.csv
2️⃣ 查找不被单词支持的文件格式和内容
每行一个单词
3️⃣ 编写C代码
由于代码篇幅过长,此处仅放核心代码部分,详细请参考Github仓库OuLu2BuBei_CsvData_Project
struct DataHandle
{
int col;
int row;
char word[128];
};
// 列级数据处理回调函数(先处理)
void col_callback(void *s, size_t len, void *data)
{
struct DataHandle *handle = (struct DataHandle *)data;
char *str = malloc(len + 1);
memset(str, 0, len + 1);
memcpy(str, (char *)s, len);
if (1 == handle->col) //只处理第二列
{
if (0 == is_english_word(str, len))
{
sprintf(handle->word, "%s", str);
}
}
free(str);
// 每进入该函数一次,列计数 + 1
(handle->col)++;
}
// 行级数据处理回调函数(后处理)
void row_callback(int c, void *data)
{
struct DataHandle *handle = (struct DataHandle *)data;
if(strlen(handle->word) > 0)
{
csv_write_word2file("1.txt", handle->word);
memset(handle->word, 0, sizeof(handle->word));
}
// 每进入该函数一次,行计数 + 1,列计数 清零
(handle->row)++;
//printf("row:%d col:%d\n", handle->row, handle->col);
handle->col = 0;
}
4️⃣ 不背单词导入
进入不背单词官网,登录账号,进入自定义单词书,开始导入生词本1.txt
.
接着按照如下步骤操作:选择上传文件
--> 识别
--> 添加描述
--> 确认提交
5️⃣ 不背单词查看生词本
博主添加的词书名称:欧陆词典-生词本
,词书描述:欧陆词典-生词本
三、反思总结
涉及对csv的解析,熟悉对csv
开源库 libcsv
的使用。
下一步需要对 libcsv
源码理解,提高编程水准和代码设计水平。
四、参考引用
无