First of all, we prepare our file[9] and its OpenOptions so that we have both read and write access on the file. You will remember this from Chapter 3, Handling Files and the Filesystem; Working with text files.
Then we write the CSV. We do this by wrapping any kind of Write in a csv::Writer[30]. You can then use write_record on it to write any data type that can be represented as an iterator over &[u8]. Most of the time, this will simply be an array of strings.
While reading, we similarly wrap a Read in a csv::Read. The records() method returns an iterator over Result of StringRecord. This way, you get to decide how to handle a malformed record. In our example, we simply skip it. Lastly, we call get() on a record to get a certain field. If there was no entry at the specified index or if it was out of bounds, this would return None.