I'm not sure if you've encountered GNU recutils before

https://www.gnu.org/software/recutils/

but it's a nice flat-file way of storing &amp; querying data in a format similar to what you described.  It's fairly easy to convert to CSV or other tabular format.  It plays nicely with version-control, making it easier to tell when a "column" (really a row in a group) has been edited because the diff just shows that one "cell" rather than a whole CSV line being modified.

It's also pretty flexible when it comes to omitted or duplicate fields.  I've taken to storing our household address book in this format and then transforming it into other formats as needed.