We break down why successfully reading a CSV via
csv.Reader still does not mean the data is valid, how to separate format errors from contract errors, and how to build a human-friendly report: record number (
rowNo), column, value, and reason. We will implement the helper
getField, the error type
RowError, validations
requiredString/
parseInt/
parseBool, and importing from
io.Reader while accumulating per-row issues.