CSV reading
Verification
Scope
Column names, guessed and declared types, values, factor levels, and parsing problems for 39 CSV files, read by each of three CSV readers. CSV text written by toCsv() and CsvWriter::formatDouble().
References
- Reference
- readr 2.2.0 read_delim(), problems(), and format_csv(), on R 4.6.1
- Versions
- R 4.6.1, readr 2.2.0, vroom 1.7.1, jsonlite 2.0.0, phit 0.4.4
Data
Method
tests/r/io.R reads each case with readr::read_delim() and records names, types, values, and problems; write cases add readr::format_csv() output. tests/IoTest.php reads the same files with identical options. Fixtures regenerated with the listed R versions on 2026-11-01; output byte-identical to the committed files.
- Check
- Comparison with a reference implementation
- Recorded
- 2026-11-02, PHP 8.5.10, macOS 27.0.1 (arm64), commit 1abdeb1
Tolerances
exact equality
Applies to: Names, types, levels, values, and problem rows
Doubles parsed from readr's shortest round-trip text, NA in identical positions
exact equality
Applies to: Written CSV text
Byte for byte
x: package value; r: reference value.
Results
119 comparisons in 41 cases: 119 pass, 0 fail, 0 skipped.
By case
| Case | Comparisons | Status |
|---|---|---|
| guess | 3 | pass |
| na | 3 | pass |
| quoting | 3 | pass |
| trim | 3 | pass |
| comment | 3 | pass |
| skip_nmax | 3 | pass |
| nocolnames | 3 | pass |
| colnames_given | 3 | pass |
| dupnames | 3 | pass |
| dupnames_universal | 3 | pass |
| coltypes | 3 | pass |
| coltypes_named | 3 | pass |
| guessmax | 3 | pass |
| trim_false | 3 | pass |
| empty_rows | 3 | pass |
| ragged | 3 | pass |
| semicolon | 3 | pass |
| select | 3 | pass |
| write | 3 | pass |
| blank_quoted_empty | 3 | pass |
| blank_quoted_empty_only | 3 | pass |
| blank_whitespace_line | 3 | pass |
| blank_whitespace_kept | 3 | pass |
| blank_tab_line | 3 | pass |
| blank_unterminated | 3 | pass |
| blank_whitespace_file | 3 | pass |
| blank_whitespace_delimiter | 3 | pass |
| blank_quoted_space | 3 | pass |
| blank_cr_line | 3 | pass |
| blank_leading_comment | 3 | pass |
| blank_comment_after_row | 3 | pass |
| quotes_stray | 3 | pass |
| quotes_problems | 3 | pass |
| quotes_unterminated | 3 | pass |
| quotes_escape_double_off | 3 | pass |
| problem_rows_skip_comment | 3 | pass |
| ragged_trim | 3 | pass |
| ragged_space | 3 | pass |
| ragged_tab | 3 | pass |
| writes CSV like readr | 1 | pass |
| formats doubles like write_csv | 1 | pass |
All 119 comparisons
| Case | Implementation | Quantity | Criterion | Status |
|---|---|---|---|---|
| guess | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| na | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| quoting | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| trim | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| comment | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| skip_nmax | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| nocolnames | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| colnames_given | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| dupnames | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| dupnames_universal | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| coltypes | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| coltypes_named | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| guessmax | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| trim_false | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| empty_rows | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| ragged | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| semicolon | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| select | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| write | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_quoted_empty | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_quoted_empty_only | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_whitespace_line | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_whitespace_kept | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_tab_line | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_unterminated | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_whitespace_file | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_whitespace_delimiter | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_quoted_space | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_cr_line | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_leading_comment | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| blank_comment_after_row | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| quotes_stray | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| quotes_problems | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| quotes_unterminated | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| quotes_escape_double_off | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| problem_rows_skip_comment | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| ragged_trim | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| ragged_space | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| ragged_tab | PHP reader | read | exact equality | pass |
| phit reader, emulated in PHP | read | exact equality | pass | |
| phit reader | read | exact equality | pass | |
| writes CSV like readr | write | exact equality | pass | |
| formats doubles like write_csv | write | exact equality | pass |
Limitations
Known differences
- Whole-number columns guess as int; readr guesses double. These columns are compared as doubles.
- empty_rows: readr numbers an empty line's problem one lower than other rows. Problem row numbers are not compared for this case.
Reproduction
Rscript tests/r/io.R
php vendor/bin/pest tests/IoTest.php
- Raw record
- site/verifications/csv-readr.json
- Input data
- tests/fixtures/io