一、问题引入

在使用不背单词记单词时,发现它缺少了取词的功能,而我平时都是使用欧陆词典取词和查找单词。

这时,我想将平时提取的生词本上传到不背单词的生词本,这样就可以把陌生单词加入复习计划,然而它所支持上传的文件和格式是限制的。不能直接将 欧陆词典 导出的文件直接导入到 不背单词,需要将文件内容格式化。
而我需要做的就是将文件格式化操作,后续经常会有导入生词本的操作,以及可以分享给其他有此需求的人。编写一个由C语言写的小程序,解决该问题。

二、解决过程

解决过程的流程描述:欧陆词典生词本 --> a file.csv --> 格式化 a_file.csv to b_file.txt --> 不背单词生词本。重点在格式化 a_file.csv to b_file.txt,其他步骤不作详细说明。

1️⃣ 观察和分析a_file.csv

生词本python 不背单词怎么看生词本_上传

2️⃣ 查找不被单词支持的文件格式和内容

每行一个单词

生词本python 不背单词怎么看生词本_bc_02

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.

生词本python 不背单词怎么看生词本_上传_03

接着按照如下步骤操作:选择上传文件 --> 识别 --> 添加描述 --> 确认提交

生词本python 不背单词怎么看生词本_生词本python_04

生词本python 不背单词怎么看生词本_上传_05

5️⃣ 不背单词查看生词本

博主添加的词书名称:欧陆词典-生词本,词书描述:欧陆词典-生词本


生词本python 不背单词怎么看生词本_bc_06

三、反思总结

涉及对csv的解析,熟悉对csv开源库 libcsv 的使用。

下一步需要对 libcsv 源码理解,提高编程水准和代码设计水平。

四、参考引用