如何提取类PDF格式CSV学生数据的姓名与学年并转换为规范电子表格?
自动化处理PDF导出式CSV学生成绩数据方案
方案一:Python脚本(适合1000+大规模数据)
该方法效率最高,适合批量处理海量数据。
步骤说明
- 读取原始CSV文件,按行加载全部数据
- 遍历每行,通过特征判断课程数据行(比如是否包含可识别的成绩数值)
- 找到首个课程行后,往上偏移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中通过公式实现数据关联:
步骤说明
- 将原始数据粘贴到Sheet1
- 在Sheet2的A2单元格(Student Name列)使用数组公式提取对应学生姓名:
(注:D列为成绩列,按需替换;=ARRAYFORMULA(IF(Sheet1!D2:D<>"", INDEX(Sheet1!A:A, ROW(Sheet1!D2:D)-5), ""))ROW(Sheet1!D2:D)-5对应姓名行偏移量) - 学年列(B2)提取对应信息:
=ARRAYFORMULA(IF(Sheet1!D2:D<>"", INDEX(Sheet1!A:A, ROW(Sheet1!D2:D)-4), "")) - 课程、Level等列直接引用原始数据:
- C2:
=ARRAYFORMULA(Sheet1!A2:A) - D2:
=ARRAYFORMULA(Sheet1!B2:B) - E2:
=ARRAYFORMULA(Sheet1!C2:C) - F2:
=ARRAYFORMULA(Sheet1!D2:D)
- C2:
注意事项
- 根据原始数据的学生信息位置,调整公式中的偏移数值(-5、-4等)
- 若原始数据用空行分隔学生,需添加空行判断逻辑优化公式
内容的提问来源于stack exchange,提问作者Rebecca Sacks




