为Java程序创建可调用的多题型试题存储CSV文件方案咨询
最优实现方案
第一步:生成符合规范的CSV文件
先将Word内的试题整理为标准CSV格式,遵循以下规则避免后续解析出错:
- 固定表头为:
主题,难度等级,题号,题型,题干,可选选项,正确答案 - 所有字段内容统一用英文双引号
"包裹,避免内容里的逗号、换行符导致CSV列错位 - 选择题的多个可选选项用英文分号
;分隔,示例:"选项A;选项B;选项C;选项D" - 判断题、开放题的「可选选项」字段填空字符串即可,无需填写内容
- CSV文件最终保存时编码选择UTF-8,避免中文乱码
第二步:Java端代码实现
1. 定义试题实体类
先创建实体类封装单道试题的所有属性,方便后续业务逻辑调用:
public class Question { private String theme; // 主题 private String difficulty; // 难度等级 private Integer id; // 题号 private String type; // 题型:judge(判断)/choice(选择)/open(开放) private String content; // 题干 private List<String> options; // 可选选项,开放题该字段为空集合 private String correctAnswer; // 正确答案 // 自行补全getter、setter、无参/全参构造方法即可 }
2. 解析CSV并存入ArrayList
新手优先推荐用JDK自带IO流实现,无需引入额外依赖,示例代码如下:
import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class QuestionLoader { public static void main(String[] args) { // 存储所有主题的ArrayList List<String> themeList = new ArrayList<>(); // 存储所有试题的ArrayList List<Question> questionList = new ArrayList<>(); // 替换为你的CSV文件实际路径 String csvPath = "C:/xxx/question_bank.csv"; String line; // 标记是否为表头行 boolean isHeader = true; try (BufferedReader br = new BufferedReader(new FileReader(csvPath))) { while ((line = br.readLine()) != null) { // 跳过表头 if (isHeader) { isHeader = false; continue; } // 按规则拆分带双引号的CSV字段,避免内容内的逗号误拆分 String[] fields = line.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)", -1); // 移除每个字段前后的双引号 for (int i = 0; i < fields.length; i++) { fields[i] = fields[i].replaceAll("^\"|\"$", "").trim(); } // 组装试题对象 Question question = new Question(); question.setTheme(fields[0]); question.setDifficulty(fields[1]); question.setId(Integer.parseInt(fields[2])); question.setType(fields[3]); question.setContent(fields[4]); // 非开放题拆分可选选项 if (!"open".equals(fields[3]) && !fields[5].isEmpty()) { question.setOptions(Arrays.asList(fields[5].split(";"))); } else { question.setOptions(new ArrayList<>()); } question.setCorrectAnswer(fields[6]); // 存入试题集合 questionList.add(question); // 主题去重后存入主题集合 if (!themeList.contains(fields[0])) { themeList.add(fields[0]); } } System.out.printf("加载完成,共加载主题%d个,试题%d道%n", themeList.size(), questionList.size()); } catch (Exception e) { e.printStackTrace(); } } }
- 如果后续需要处理更复杂的CSV格式,可以引入OpenCSV工具库,无需自行编写拆分逻辑,使用更简洁。
注意事项
- CSV文件编码必须和Java读取时的编码一致,统一使用UTF-8是最优选择
- 如果可选选项内容包含分号,可以换其他不会和内容冲突的特殊字符做分隔符,比如
| - 试题数据量大、有多线程读写需求时,可以将ArrayList替换为对应的线程安全集合类,按需调整即可
内容的提问来源于stack exchange,提问作者Louis Wheelz
相关产品推荐
相关产品推荐

