Unfortunately, there is no real industry standard for CSV files. The closest thing we do currently have (since 2005) is RFC 4180. Working with non-standardized data often comes with surprises, but what exactly happens when parsing CSV data that doesn't match this RFC?
This project is about to find that out...
This benchmark project was created for the development of FastCSV.
Note
Since this comparison uses the result of FastCSV as a reference value (expected result), the comparison is highly biased.
- Commons CSV 1.10.0
- CSVeed 0.7.5
- FastCSV 3.0.0
- Jackson CSV 2.16.1
- Java CSV 2.0
- Opencsv 5.9
- sesseltjonna-csv 1.0.25
- SimpleFlatMapper 8.2.3
- Super CSV 2.4.0
- Univocity 2.9.1
./gradlew run
To have results which are unambiguous to compare (even with multi-line records), we need to use some special characters. The libraries itself don't get in touch with these special characters as the conversion is done from the outside.
Character | Usage |
---|---|
␣ |
Space |
␍ |
Carriage return |
␊ |
Line feed |
[SE] |
Skip emtpy rows |
⏎ |
New row |
↷ |
New column |
◯ |
Empty field |
∅ |
Empty list |
Input | Flags | Commons CSV | Expected | Implemented as expected by |
---|---|---|---|---|
A,"B |
— | 💥 UncheckedIOException | A↷B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
"A,B |
— | 💥 UncheckedIOException | A,B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
"D"␣ |
— | D |
D␣ |
FastCSV, Opencsv, SuperCSV |
"A,B"␣ |
— | A,B |
A,B␣ |
FastCSV, SuperCSV |
"D"z |
— | 💥 UncheckedIOException | Dz |
FastCSV, Opencsv, SuperCSV |
"A,B"z |
— | 💥 UncheckedIOException | A,Bz |
FastCSV, SuperCSV |
Input | Flags | CSVeed | Expected | Implemented as expected by |
---|---|---|---|---|
␣ |
— | ◯ |
␣ |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV, Univocity |
␣,␣ |
— | ◯↷◯ |
␣↷␣ |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV, Univocity |
,␣ |
— | ◯↷◯ |
◯↷␣ |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV, Univocity |
␣D |
— | D |
␣D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV, Univocity |
␣D␣,␣D␣ |
— | D↷D |
␣D␣↷␣D␣ |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV, Univocity |
A,␊B |
— | 💥 CsvException | A↷◯⏎B |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
␣, |
— | ◯↷◯ |
␣↷◯ |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV, Univocity |
␣,␊D |
— | 💥 CsvException | ␣↷◯⏎D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
D␊ |
— | D⏎◯ |
D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV, Univocity |
D␍ |
— | D⏎◯ |
D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV |
D␍␊ |
— | D⏎◯ |
D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV |
A,"B |
— | 💥 CsvException | A↷B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
A,B" |
— | 💥 CsvException | A↷B" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
"A,B |
— | 💥 CsvException | A,B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
"A␍␊B" |
— | A␍B |
A␍␊B |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
A␊B,C |
— | 💥 CsvException | A⏎B↷C |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
A,B␊C |
— | 💥 CsvException | A↷B⏎C |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
A␊;B,C␊D |
— | 💥 CsvException | A⏎;B↷C⏎D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
"D"␣ |
— | D |
D␣ |
FastCSV, Opencsv, SuperCSV |
"A,B"␣ |
— | A,B |
A,B␣ |
FastCSV, SuperCSV |
␣"D" |
— | D |
␣"D" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
␣"D"␣ |
— | D |
␣"D"␣ |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
"D"z |
— | 💥 CsvException | Dz |
FastCSV, Opencsv, SuperCSV |
"A,B"z |
— | 💥 CsvException | A,Bz |
FastCSV, SuperCSV |
z"D" |
— | 💥 CsvException | z"D" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
z"A,B" |
— | 💥 CsvException | z"A↷B" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
z"D"z |
— | 💥 CsvException | z"D"z |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
Input | Flags | JacksonCSV | Expected | Implemented as expected by |
---|---|---|---|---|
A,"B |
— | 💥 RuntimeJsonMappingException | A↷B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
"A,B |
— | 💥 RuntimeJsonMappingException | A,B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
"D"␣ |
— | D |
D␣ |
FastCSV, Opencsv, SuperCSV |
"A,B"␣ |
— | A,B |
A,B␣ |
FastCSV, SuperCSV |
"D"z |
— | 💥 RuntimeJsonMappingException | Dz |
FastCSV, Opencsv, SuperCSV |
"A,B"z |
— | 💥 RuntimeJsonMappingException | A,Bz |
FastCSV, SuperCSV |
Input | Flags | JavaCSV | Expected | Implemented as expected by |
---|---|---|---|---|
"D"␣ |
— | D |
D␣ |
FastCSV, Opencsv, SuperCSV |
"A,B"␣ |
— | A,B |
A,B␣ |
FastCSV, SuperCSV |
"D"z |
— | D |
Dz |
FastCSV, Opencsv, SuperCSV |
"A,B"z |
— | A,B |
A,Bz |
FastCSV, SuperCSV |
Input | Flags | Opencsv | Expected | Implemented as expected by |
---|---|---|---|---|
A,"B |
— | 💥 CsvMalformedLineException | A↷B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
A,B" |
— | 💥 CsvMalformedLineException | A↷B" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
"A,B |
— | 💥 CsvMalformedLineException | A,B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
"A␍B" |
— | A␊B |
A␍B |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
"A␍␊B" |
— | A␊B |
A␍␊B |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
"A,B"␣ |
— | A,B"␣ |
A,B␣ |
FastCSV, SuperCSV |
␣"D" |
— | ␣D |
␣"D" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
␣"D"␣ |
— | ␣D"␣ |
␣"D"␣ |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
"A,B"z |
— | A,B"z |
A,Bz |
FastCSV, SuperCSV |
z"D" |
— | zD |
z"D" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
z"A,B" |
— | zA,B |
z"A↷B" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
z"D"z |
— | zD"z |
z"D"z |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
Input | Flags | sesseltjonna-csv | Expected | Implemented as expected by |
---|---|---|---|---|
A,␊B |
— | 💥 CsvException | A↷◯⏎B |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
␣,␊D |
— | 💥 CsvException | ␣↷◯⏎D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
A␍B |
— | A␍B |
A⏎B |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV |
␍D |
— | ␍D |
◯⏎D |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV |
A,"B |
— | 💥 CsvBuilderException | A↷B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
"A,B |
— | 💥 CsvBuilderException | A,B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
A␊B,C |
— | A⏎B,C |
A⏎B↷C |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
A,B␊C |
— | 💥 CsvException | A↷B⏎C |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
A␊;B,C␊D |
— | A⏎;B,C⏎D |
A⏎;B↷C⏎D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV, Univocity |
"D"␣ |
— | D |
D␣ |
FastCSV, Opencsv, SuperCSV |
"A,B"␣ |
— | A,B |
A,B␣ |
FastCSV, SuperCSV |
"D"z |
— | D |
Dz |
FastCSV, Opencsv, SuperCSV |
"A,B"z |
— | A,B |
A,Bz |
FastCSV, SuperCSV |
Input | Flags | Simpleflatmapper | Expected | Implemented as expected by |
---|---|---|---|---|
"D"␣ |
— | D"␣ |
D␣ |
FastCSV, Opencsv, SuperCSV |
"A,B"␣ |
— | A,B"␣ |
A,B␣ |
FastCSV, SuperCSV |
"D"z |
— | D"z |
Dz |
FastCSV, Opencsv, SuperCSV |
"A,B"z |
— | A,B"z |
A,Bz |
FastCSV, SuperCSV |
Input | Flags | SuperCSV | Expected | Implemented as expected by |
---|---|---|---|---|
A,"B |
— | 💥 SuperCsvException | A↷B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
A,B" |
— | 💥 SuperCsvException | A↷B" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
"A,B |
— | 💥 SuperCsvException | A,B |
FastCSV, JavaCSV, Simpleflatmapper, Univocity |
"A␍B" |
— | A␊B |
A␍B |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
"A␍␊B" |
— | A␊B |
A␍␊B |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
␣"D" |
— | ␣D |
␣"D" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
␣"D"␣ |
— | ␣D␣ |
␣"D"␣ |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
z"D" |
— | zD |
z"D" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
z"A,B" |
— | zA,B |
z"A↷B" |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
z"D"z |
— | zDz |
z"D"z |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, sesseltjonna-csv, Simpleflatmapper, Univocity |
Input | Flags | Univocity | Expected | Implemented as expected by |
---|---|---|---|---|
A␍B |
— | A␍B |
A⏎B |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV |
D␍ |
— | D␍ |
D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV |
␍D |
— | ␍D |
◯⏎D |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, Opencsv, Simpleflatmapper, SuperCSV |
␍D |
[SE] |
␍D |
D |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, SuperCSV |
A␍␊B |
— | A␍⏎B |
A⏎B |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV |
D␍␊ |
— | D␍ |
D |
Commons CSV, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV |
␍␊D |
— | ␍⏎D |
◯⏎D |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, Opencsv, sesseltjonna-csv, Simpleflatmapper, SuperCSV |
␍␊D |
[SE] |
␍⏎D |
D |
Commons CSV, CSVeed, FastCSV, JacksonCSV, JavaCSV, SuperCSV |
"D"␣ |
— | D |
D␣ |
FastCSV, Opencsv, SuperCSV |
"A,B"␣ |
— | A,B |
A,B␣ |
FastCSV, SuperCSV |
"D"z |
— | "D"z |
Dz |
FastCSV, Opencsv, SuperCSV |
"A,B"z |
— | "A,B"z |
A,Bz |
FastCSV, SuperCSV |
Input | Flags | Expected | Commons CSV | CSVeed | FastCSV | JacksonCSV | JavaCSV | Opencsv | sesseltjonna-csv | Simpleflatmapper | SuperCSV | Univocity |
---|---|---|---|---|---|---|---|---|---|---|---|---|
D |
— | D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
D,D |
— | D↷D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
,D |
— | ◯↷D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
␣ |
— | ␣ |
✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
␣,␣ |
— | ␣↷␣ |
✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
,␣ |
— | ◯↷␣ |
✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
␣D |
— | ␣D |
✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
␣D␣,␣D␣ |
— | ␣D␣↷␣D␣ |
✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
D, |
— | D↷◯ |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
A,␊B |
— | A↷◯⏎B |
✅ | 💥 | ✅ | ✅ | ✅ | ✅ | 💥 | ✅ | ✅ | ✅ |
␣, |
— | ␣↷◯ |
✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
␣,␊D |
— | ␣↷◯⏎D |
✅ | 💥 | ✅ | ✅ | ✅ | ✅ | 💥 | ✅ | ✅ | ✅ |
A␊B |
— | A⏎B |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
D␊ |
— | D |
✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
␊D |
— | ◯⏎D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
␊D |
[SE] |
D |
✅ | ✅ | ✅ | ✅ | ✅ | ➖ | ➖ | ➖ | ✅ | ✅ |
A␍B |
— | A⏎B |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
D␍ |
— | D |
✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
␍D |
— | ◯⏎D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ |
␍D |
[SE] |
D |
✅ | ✅ | ✅ | ✅ | ✅ | ➖ | ➖ | ➖ | ✅ | ❌ |
A␍␊B |
— | A⏎B |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
D␍␊ |
— | D |
✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
␍␊D |
— | ◯⏎D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
␍␊D |
[SE] |
D |
✅ | ✅ | ✅ | ✅ | ✅ | ➖ | ➖ | ➖ | ✅ | ❌ |
"␣D␣" |
— | ␣D␣ |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"D" |
— | D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"D",D |
— | D↷D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
D,"D" |
— | D↷D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
A,"B |
— | A↷B |
💥 | 💥 | ✅ | 💥 | ✅ | 💥 | 💥 | ✅ | 💥 | ✅ |
A,B" |
— | A↷B" |
✅ | 💥 | ✅ | ✅ | ✅ | 💥 | ✅ | ✅ | 💥 | ✅ |
"A,B |
— | A,B |
💥 | 💥 | ✅ | 💥 | ✅ | 💥 | 💥 | ✅ | 💥 | ✅ |
"""D" |
— | "D |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"D""" |
— | D" |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"A""B" |
— | A"B |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"A␊B" |
— | A␊B |
✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
"A␍B" |
— | A␍B |
✅ | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
"A␍␊B" |
— | A␍␊B |
✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
A␊B,C |
— | A⏎B↷C |
✅ | 💥 | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
A,B␊C |
— | A↷B⏎C |
✅ | 💥 | ✅ | ✅ | ✅ | ✅ | 💥 | ✅ | ✅ | ✅ |
A␊;B,C␊D |
— | A⏎;B↷C⏎D |
✅ | 💥 | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ |
"D"␣ |
— | D␣ |
❌ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ |
"A,B"␣ |
— | A,B␣ |
❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ |
␣"D" |
— | ␣"D" |
✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
␣"D"␣ |
— | ␣"D"␣ |
✅ | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
"D"z |
— | Dz |
💥 | 💥 | ✅ | 💥 | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ |
"A,B"z |
— | A,Bz |
💥 | 💥 | ✅ | 💥 | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ |
z"D" |
— | z"D" |
✅ | 💥 | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
z"A,B" |
— | z"A↷B" |
✅ | 💥 | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |
z"D"z |
— | z"D"z |
✅ | 💥 | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ❌ | ✅ |