KORPO
Engineering proof / CSV v1
Owned prototype · Synthetic fixtures

Quoted fields.
Clear failures.

A small, dependency-free Python CSV-to-JSON CLI. String values stay strings. Ambiguous headers, broken quotes and missing fields fail instead of disappearing.

This is prototype evidence, not client work. Every example below uses labelled synthetic data and a real local subprocess capture. No customer dataset has been tested. No contract, funding, acceptance or revenue is evidenced. This page is a prepared static artifact; its build does not verify publication.
14 converter tests passed · 5 captured conversions · 6 captured rejections

Actual input. Actual output.

All results are captured, not generated in your browser. Exit 0 means a complete JSON array was parsed and its full string values matched expectations. Rejections produced nonzero exit and empty stdout. Unicode appears as valid JSON escapes. No JavaScript, external assets or network requests are needed.

Comma / quotes / Unicode / newline / backslashes

converted · exit 0

/usr/bin/python3 -I -S csv_to_json.py fixtures/comma-specials.csv

Synthetic input

id,note,path
001,"café, 雪 ""ok""
next",C:\data\x

stdout / JSON

[
  {
    "id": "001",
    "note": "caf\u00e9, \u96ea \"ok\"\nnext",
    "path": "C:\\data\\x"
  }
]
Exact input bytes / SHA256
69642c6e6f74652c706174680d0a3030312c22636166c3a92c20e99baa2022226f6b22220a6e657874222c433a5c646174615c780d0a
SHA256 d7213ded04d6da7ea885f94caf35afddfd67c83d3e5f062bb73cc08efe2f5454

Semicolon, delimiter inside quoted cell

converted · exit 0

/usr/bin/python3 -I -S csv_to_json.py fixtures/semicolon.csv --delimiter semicolon

Synthetic input

id;note
007;"a;b"

stdout / JSON

[
  {
    "id": "007",
    "note": "a;b"
  }
]
Exact input bytes / SHA256
69643b6e6f74650a3030373b22613b62220a
SHA256 a5a9c76793513e00efd201941edae583584f691426c4ba3d9eb0fa66bb985632

Tab dialect, quoted tab

converted · exit 0

/usr/bin/python3 -I -S csv_to_json.py fixtures/tab.csv --dialect excel-tab

Synthetic input

id	note
009	"a	b"

stdout / JSON

[
  {
    "id": "009",
    "note": "a\tb"
  }
]
Exact input bytes / SHA256
6964096e6f74650a3030390922610962220a
SHA256 1423d322a5d25d5cf004e4e731adf3fbc136368aee8eac78bbf2adf1056c39d4

UTF-8 BOM, leading zero

converted · exit 0

/usr/bin/python3 -I -S csv_to_json.py fixtures/utf8-bom.csv

Synthetic input

id,v
001,x

stdout / JSON

[
  {
    "id": "001",
    "v": "x"
  }
]
Exact input bytes / SHA256
efbbbf69642c760a3030312c780a
SHA256 d10527d332e95f794e3f01b325140cc3406ac4ee4bb68ccd415a549d6b333d18

Explicit Windows-1252 encoding

converted · exit 0

/usr/bin/python3 -I -S csv_to_json.py fixtures/encoding.csv --encoding cp1252

Synthetic input

id,v
001,café

stdout / JSON

[
  {
    "id": "001",
    "v": "caf\u00e9"
  }
]
Exact input bytes / SHA256
69642c760a3030312c636166e90a
SHA256 252eb66885be9df74b03abe16a88acf15c6d4a427b14e2b8fa53fbfe993addac

Reject missing field

rejected · exit 2

/usr/bin/python3 -I -S csv_to_json.py fixtures/ragged-missing.csv

Synthetic input

a,b
1

stderr / no JSON stdout

csv_to_json: ragged row at record 2: expected 2 fields, got 1
Exact input bytes / SHA256
612c620a310a
SHA256 551cf7e87e04261c5fc4f1a58b2598b1ddf3b221711faf2ce212b1692b233988

Reject extra field

rejected · exit 2

/usr/bin/python3 -I -S csv_to_json.py fixtures/ragged-extra.csv

Synthetic input

a,b
1,2,3

stderr / no JSON stdout

csv_to_json: ragged row at record 2: expected 2 fields, got 3
Exact input bytes / SHA256
612c620a312c322c330a
SHA256 f47a33245cb42a1f42fe4c947d21bda44d5c97eb7cbdacd4112fdd859709cdbf

Reject duplicate header

rejected · exit 2

/usr/bin/python3 -I -S csv_to_json.py fixtures/duplicate-header.csv

Synthetic input

a,a
1,2

stderr / no JSON stdout

csv_to_json: duplicate header
Exact input bytes / SHA256
612c610a312c320a
SHA256 921520be8279e81db6a46688da4ae835cadd820a6892a557e3bfe1b06746b711

Reject empty header

rejected · exit 2

/usr/bin/python3 -I -S csv_to_json.py fixtures/empty-header.csv

Synthetic input

a,
1,2

stderr / no JSON stdout

csv_to_json: empty input or empty header
Exact input bytes / SHA256
612c0a312c320a
SHA256 07ee34f85a3c3c338c9071f8a4827cded3dc0e8697d24cc1add80b0ec85766b8

Reject unterminated quote

rejected · exit 2

/usr/bin/python3 -I -S csv_to_json.py fixtures/unclosed-quote.csv

Synthetic input

a,b
1,"open

stderr / no JSON stdout

csv_to_json: malformed quote: unterminated quoted field
Exact input bytes / SHA256
612c620a312c226f70656e
SHA256 3ea6ee002867d408c843fbc62fd6d644ec31f0c53b60299268d0b80107449d7f

Reject quote inside unquoted cell

rejected · exit 2

/usr/bin/python3 -I -S csv_to_json.py fixtures/bare-quote.csv

Synthetic input

a,b
1,ba"re

stderr / no JSON stdout

csv_to_json: malformed quote: quote inside unquoted field
Exact input bytes / SHA256
612c620a312c62612272650a
SHA256 7d711f89146d3b7de044d634f19681c1c0c437e9fe13bda22b5502afc0c031f1

Repeatable, within its limits.

The CLI defaults to comma and UTF-8 with optional BOM. Explicit delimiter, dialect and encoding options are available. Quoted newlines, doubled quotes and literal backslashes are preserved. No type inference, automatic delimiter guessing, nested schema or spreadsheet support is claimed.

This intentionally small prototype buffers the input and JSON array in memory. The Python csv field-size limit is retained. It is not a streaming large-file tool, and the synthetic suite does not establish compatibility with every CSV producer.

Actual converter test command

/usr/bin/python3 -I -S test_csv.py
Complete real converter test output
test_comma_unicode_backslash_quotes_newline (__main__.CsvTests.test_comma_unicode_backslash_quotes_newline) ... ok
test_crlf_inside_quotes (__main__.CsvTests.test_crlf_inside_quotes) ... ok
test_empty_cells_and_header_only (__main__.CsvTests.test_empty_cells_and_header_only) ... ok
test_encoding_override (__main__.CsvTests.test_encoding_override) ... ok
test_explicit_delimiter_overrides_dialect (__main__.CsvTests.test_explicit_delimiter_overrides_dialect) ... ok
test_file_input_and_missing_file (__main__.CsvTests.test_file_input_and_missing_file) ... ok
test_invalid_encoding_and_delimiter (__main__.CsvTests.test_invalid_encoding_and_delimiter) ... ok
test_quote_only_and_json_escaping (__main__.CsvTests.test_quote_only_and_json_escaping) ... ok
test_reject_malformed_quotes_no_partial_stdout (__main__.CsvTests.test_reject_malformed_quotes_no_partial_stdout) ... ok
test_reject_ragged_duplicate_empty_headers (__main__.CsvTests.test_reject_ragged_duplicate_empty_headers) ... ok
test_semicolon (__main__.CsvTests.test_semicolon) ... ok
test_tab_dialect (__main__.CsvTests.test_tab_dialect) ... ok
test_unit_strings (__main__.CsvTests.test_unit_strings) ... ok
test_utf8_bom (__main__.CsvTests.test_utf8_bom) ... ok

----------------------------------------------------------------------
Ran 14 tests in 1.213s

OK

Executed csv_to_json.py SHA256

1bb989936d1cb44ff74e4fef6b1a40a8881cbf09599a59fcdff69ae520f97903

Local evidence captured at 2026-10-27T02:20:20.390903+00:00. CLI source and operational tooling are deliberately not distributed by this public results page.