You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:15:02