diff --git a/ut3_survival/realist.py b/ut3_survival/realist.py
index 1b32adbc993b692f67f27555c8e1805f2ae96c43..8a554a000a0af85cea33e661aaad41b9d75eb41c 100644
--- a/ut3_survival/realist.py
+++ b/ut3_survival/realist.py
@@ -65,3 +65,13 @@ def read_parse_several_xls(xls_filenames: [str], lower: bool=None) -> [StudentEn
 def student_entry_list_to_df(students: [StudentEntry]) -> pandas.DataFrame:
     '''Create a DataFrame from a student list.'''
     return pandas.DataFrame(students, columns=student_columns)
+
+def read_parse_csv(csv_filename: str) -> pandas.DataFrame:
+    df = pandas.read_csv(csv_filename)
+
+    expected_columns = set(student_columns)
+    parsed_columns = {str(x) for x in df.columns}
+    if not expected_columns.issubset(parsed_columns):
+        raise RuntimeError(f"missing columns in csv file '{csv_filename}': {expected_columns - parsed_columns}")
+
+    return df