You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何提取类PDF格式CSV学生数据的姓名与学年并转换为规范电子表格?

自动化处理PDF导出式CSV学生成绩数据方案

方案一:Python脚本(适合1000+大规模数据)

该方法效率最高,适合批量处理海量数据。

步骤说明

  1. 读取原始CSV文件,按行加载全部数据
  2. 遍历每行,通过特征判断课程数据行(比如是否包含可识别的成绩数值)
  3. 找到首个课程行后,往上偏移5行提取学生姓名,同时从表头区域提取学年信息
  4. 收集当前学生的所有课程行,将学生信息与课程数据合并为规范格式记录
  5. 将所有整理好的记录写入新CSV文件

示例代码

import csv

# 可根据实际数据调整的参数
NAME_ROW_OFFSET = -5  # 姓名在首个课程行上方第5行
SCHOOL_YEAR_COL = 0   # 学年所在列索引
COURSE_COL = 0        # 课程名称列索引
LEVEL_COL = 1         # 年级/Level列索引
GRADING_PERIOD_COL = 2 # 评分周期列索引
GRADE_COL = 3         # 成绩列索引

def process_student_grades(input_csv, output_csv):
    with open(input_csv, 'r', newline='', encoding='utf-8') as infile, \
         open(output_csv, 'w', newline='', encoding='utf-8') as outfile:
        
        csv_reader = csv.reader(infile)
        csv_writer = csv.writer(outfile)
        
        # 写入目标表头
        csv_writer.writerow(['Student Name', 'School Year', 'Class', 'Level', 'Grading Period', 'Grade'])
        
        all_rows = list(csv_reader)
        current_student = None
        current_school_year = None
        student_course_rows = []
        
        for row_idx, row in enumerate(all_rows):
            # 判断是否为课程行(示例:非空且成绩列是数字,需根据实际调整判断逻辑)
            is_course_row = len(row) >= 4 and row[GRADE_COL].replace('.', '').isdigit()
            
            if is_course_row:
                if not current_student:
                    # 提取学生姓名
                    name_row = all_rows[row_idx + NAME_ROW_OFFSET]
                    current_student = name_row[0].strip()
                    # 提取学年(示例:姓名行下一行,按需调整位置)
                    year_row = all_rows[row_idx + NAME_ROW_OFFSET + 1]
                    current_school_year = year_row[SCHOOL_YEAR_COL].strip()
                student_course_rows.append(row)
            else:
                # 遇到分隔区域,写入当前学生的所有课程记录
                if current_student and student_course_rows:
                    for course_row in student_course_rows:
                        csv_writer.writerow([
                            current_student,
                            current_school_year,
                            course_row[COURSE_COL].strip(),
                            course_row[LEVEL_COL].strip(),
                            course_row[GRADING_PERIOD_COL].strip(),
                            course_row[GRADE_COL].strip()
                        ])
                    # 重置状态处理下一个学生
                    current_student = None
                    current_school_year = None
                    student_course_rows = []
        
        # 处理最后一个学生的数据
        if current_student and student_course_rows:
            for course_row in student_course_rows:
                csv_writer.writerow([
                    current_student,
                    current_school_year,
                    course_row[COURSE_COL].strip(),
                    course_row[LEVEL_COL].strip(),
                    course_row[GRADING_PERIOD_COL].strip(),
                    course_row[GRADE_COL].strip()
                ])

# 执行处理(替换为你的文件路径)
process_student_grades('原始数据.csv', '规范成绩数据.csv')

注意事项

  • 需根据实际CSV的列位置、课程行特征调整代码中的参数(列索引、判断条件等)
  • 若原始数据有特殊编码,修改encoding参数(比如gbk

方案二:Google Sheets公式(适合轻量可视化处理)

如果不想写代码,可在Google Sheets中通过公式实现数据关联:

步骤说明

  1. 将原始数据粘贴到Sheet1
  2. 在Sheet2的A2单元格(Student Name列)使用数组公式提取对应学生姓名:
    =ARRAYFORMULA(IF(Sheet1!D2:D<>"", INDEX(Sheet1!A:A, ROW(Sheet1!D2:D)-5), ""))
    
    (注:D列为成绩列,按需替换;ROW(Sheet1!D2:D)-5对应姓名行偏移量)
  3. 学年列(B2)提取对应信息:
    =ARRAYFORMULA(IF(Sheet1!D2:D<>"", INDEX(Sheet1!A:A, ROW(Sheet1!D2:D)-4), ""))
    
  4. 课程、Level等列直接引用原始数据:
    • C2: =ARRAYFORMULA(Sheet1!A2:A)
    • D2: =ARRAYFORMULA(Sheet1!B2:B)
    • E2: =ARRAYFORMULA(Sheet1!C2:C)
    • F2: =ARRAYFORMULA(Sheet1!D2:D)

注意事项

  • 根据原始数据的学生信息位置,调整公式中的偏移数值(-5、-4等)
  • 若原始数据用空行分隔学生,需添加空行判断逻辑优化公式

内容的提问来源于stack exchange,提问作者Rebecca Sacks

火山引擎 最新活动