moon-csv-lite

A MoonBit CSV quality toolkit for auditing, contracts, gates, and chart previews.

csv
audit
contract
quality
moonbit
moon add clhhhhh/moon-csv-lite@0.1.0
Download zip
Author
Version
0.1.0
License
MIT
Last updated
last month
Downloads
15
README

#moon-csv-lite

A lightweight CSV parsing, validation, profiling, visualization, and conversion toolkit implemented in MoonBit.

moon-csv-lite focuses on practical CSV workloads. It parses CSV text into rows and fields, writes rows back to CSV text, validates header-aware tables, profiles column quality, detects table-level quality issues, generates review-friendly data passports, enforces reusable quality contracts, and exports CSV data to Markdown tables, JSON Lines, machine-readable audit JSON, and simple chart previews.

#Features

  • Parse CSV text into rows and fields
  • Write rows back to CSV text
  • Support empty fields, quoted fields, commas in quotes, and escaped quotes
  • Support LF and CRLF line endings
  • Support custom dialects such as TSV, semicolon-separated, and pipe-separated values
  • Detect likely input dialects automatically
  • Parse header-aware tables
  • Validate required fields and text/integer/float/boolean columns
  • Infer validation schemas from observed data
  • Generate end-to-end Markdown, HTML, and JSON audit reports
  • Compute 0-100 quality scores with grade, risk, and structure/completeness/consistency/uniqueness dimensions
  • Generate CSV data passports with dataset identity, shape fingerprint, quality summary, schema summary, and recommendations
  • Compare baseline and candidate CSV snapshots with schema, type, missing-value, row-count, column-count, and score drift reports
  • Enforce CSV quality gates that turn drift and score regressions into pass/fail release decisions
  • Define reusable CSV quality contracts for required columns, score thresholds, row counts, column types, numeric ranges, allowed values, and unique keys
  • Infer starter quality contracts from representative CSV samples
  • Generate reusable chart previews from CSV as JSON specs, standalone SVG, or HTML reports
  • Auto-pick label/value columns for bar, line, and pie-style previews, with duplicate-label aggregation and category counts
  • Detect table-level quality issues such as duplicate headers, empty headers, all-empty rows, all-empty columns, and duplicate rows
  • Profile columns with empty counts, unique counts, inferred types, and numeric stats
  • Render human-readable data quality reports
  • Export tables to Markdown and JSON Lines
  • Export tables and quality reports to HTML
  • Transform tables with select/drop/rename/filter/sort/slice/fill/deduplicate helpers
  • Aggregate columns with count, sum, average, min, max, and group-by summaries
  • Validate row widths, required columns, numeric ranges, allowed values, and duplicate keys
  • Join and combine tables with inner join, left join, anti join, append, union-by-name, and transpose helpers
  • Clean data with empty row/column dropping, replacement, boolean normalization, coalesce, missing summaries, and row numbers
  • Use the cmd/csvlite CLI for shell-friendly audit, audit-json, passport, passport-json, score, drift, gate, contract, infer-contract, sniff, schema, profile, check, export, select, group, and missing-summary commands
  • Run a Chinese browser Playground backed by the MoonBit JavaScript backend for local CSV upload, visual audit review, and chart preview

#What It Does

moon-csv-lite is meant to be a practical CSV foundation package for MoonBit projects. It covers eight common jobs:

  1. Read and write CSV-like data: parse rows, stringify rows, handle quoted cells, escaped quotes, CRLF, TSV, semicolon-separated data, and custom delimiters.
  2. Understand tabular data: treat the first row as headers, access cells by column name, infer scalar types, detect missing values, table-quality issues, and column profiles.
  3. Validate and transform tables: check required fields, row widths, numeric ranges, allowed values, unique keys, joins, selections, sorting, deduplication, normalization, and grouping.
  4. Generate reports and UI output: export Markdown, JSON Lines, HTML, JSON audit reports, CLI output, and a MoonBit JS-backed browser playground for local inspection or CI logs.
  5. Preview data visually: turn CSV tables into chart specs, SVG, and HTML previews for quick review in docs, CLIs, and browser tools.
  6. Package data assets: generate a CSV Data Passport with identity, fingerprint, quality score, schema summary, column metadata, and recommendations for code review, release notes, or CI artifacts.
  7. Protect data releases: compare a baseline CSV with a candidate CSV and fail a quality gate when schema, type, score, or missing-value regressions violate a policy.
  8. Codify reusable data rules: infer a starter quality contract from a known-good CSV, then check future CSV files against score, schema, range, enum, row-count, and unique-key rules.

moon-csv-lite deliberately avoids being only another CSV parser, DataFrame, or charting package. On mooncakes.io, related packages already exist in adjacent areas:

  • moonbit-community/NyaCSV and maria/csv_parser focus on CSV parsing and serialization.
  • ihb2032/MoonFrame and smallbearrr/pandas focus on DataFrame-style table manipulation and data analysis.
  • Xpeng/mooncharts and JunJunTnT/moonchart focus on reusable SVG chart generation.

This project's independent contribution is the quality workflow around CSV assets: audit reports, schema/profile output, data passports, quality scores, drift reports, CI-style gates, reusable quality contracts, fixture verification, example reports, CLI commands, and a MoonBit JS-backed browser playground. The parser, table helpers, and chart previews support that workflow rather than replacing those more specialized packages.

#Quick Start

moon check moon test moon run cmd/main moon run examples/basic moon run examples/quality-report moon run examples/rf-measurement moon run cmd/csvlite -- markdown "name,age\nAlice,18" moon run cmd/csvlite -- passport "id,amount\nA,10\nB," sales-dataset

#One-Command Verification

Run the full local verification flow on Windows:

.\scripts\verify.ps1

This runs format checks, moon check, all MoonBit tests, runnable examples, CLI smoke tests, fixture-based tests, MoonBit JS playground engine generation, the browser playground smoke test, and moon package --list.

Open the browser playground:

.\scripts\build-playground-engine.ps1 start .\playground\index.html

For only the realistic fixture smoke tests:

.\scripts\test-fixtures.ps1

For a compact project status summary:

.\scripts\status.ps1

#Documentation

  • API Guide: public API grouped by workflow.
  • Cookbook: task-oriented recipes for common CSV workflows.
  • Architecture: module design and audit workflow overview.
  • Why MoonBit: ecosystem value and project scope.
  • Roadmap: planned CLI, reporting, CI, fixture, and benchmark work.
  • Commit Plan: suggested commit split after GitHub access is available.
  • Example Reports: generated audit report examples from the fixture set.
  • Playground: Chinese browser workbench backed by the MoonBit JS backend for visual CSV auditing, paste input, and local CSV upload.
  • Contributing: development setup, fixture workflow, testing, and commit guidance.
  • Release Process: local verification, CI, and mooncakes.io publication checklist.
  • Submission Checklist: local release and contest submission checklist.

#API

parse(input : String) -> Array[Array[String]]

stringify(rows : Array[Array[String]]) -> String

parse_with_dialect(input : String, dialect : CsvDialect) -> Array[Array[String]]

stringify_with_dialect(rows : Array[Array[String]], dialect : CsvDialect) -> String

parse_table(input : String) -> CsvTable

parse_checked(input : String) -> CsvParseReport

parse_table_checked(input : String) -> CsvTableParseReport

parse_issues_to_text(issues : Array[CsvParseError]) -> String

sniff_dialect(input : String) -> CsvDialect

parse_table_auto(input : String) -> CsvTable

infer_schema(table : CsvTable) -> Array[CsvInferredColumnRule]

infer_validation_rules(table : CsvTable) -> Array[CsvColumnRule]

table_schema_markdown(table : CsvTable) -> String

audit_csv(input : String) -> CsvAuditReport

audit_quality_score(report : CsvAuditReport) -> CsvAuditScore

audit_csv_score(input : String) -> CsvAuditScore

audit_quality_score_text(score : CsvAuditScore) -> String

audit_drift(baseline_input : String, candidate_input : String) -> CsvDriftReport

audit_drift_markdown(baseline_input : String, candidate_input : String) -> String

audit_drift_json(baseline_input : String, candidate_input : String) -> String

audit_quality_gate_default(baseline_input : String, candidate_input : String) -> CsvQualityGateReport

audit_quality_gate_markdown(baseline_input : String, candidate_input : String) -> String

audit_quality_gate_json(baseline_input : String, candidate_input : String) -> String

quality_contract_from_csv(input : String) -> CsvQualityContract

quality_contract_infer_csv(input : String) -> String

audit_quality_contract(input : String, contract : CsvQualityContract) -> CsvContractReport

audit_quality_contract_markdown(input : String, contract_csv : String) -> String

audit_quality_contract_json(input : String, contract_csv : String) -> String

csv_data_passport(input : String, name : String) -> CsvDataPassport

csv_data_passport_markdown(input : String, name : String) -> String

csv_data_passport_json(input : String, name : String) -> String

audit_quality_issues(table : CsvTable) -> Array[CsvAuditQualityIssue]

audit_quality_issues_markdown(issues : Array[CsvAuditQualityIssue]) -> String

audit_csv_markdown(input : String) -> String

audit_csv_html(input : String) -> String

audit_csv_json(input : String) -> String

chart_csv_spec(input : String) -> CsvChartSpec

chart_csv_json(input : String, kind : String) -> String

chart_csv_svg(input : String, kind : String) -> String

chart_csv_html(input : String, kind : String) -> String

chart_csv_json_with_columns(input : String, kind : String, label_column : String, value_column : String) -> String

table_get(table : CsvTable, row_index : Int, column : String) -> String?

table_to_markdown(table : CsvTable) -> String

table_to_json_lines(table : CsvTable) -> String

validate_table(table : CsvTable, rules : Array[CsvColumnRule]) -> Array[CsvValidationError]

validation_errors_to_text(errors : Array[CsvValidationError]) -> String

profile_table(table : CsvTable) -> Array[ColumnProfile]

profile_report(table : CsvTable) -> String

inferred_type_name(kind : CsvInferredType) -> String

table_row_count(table : CsvTable) -> Int

table_column_count(table : CsvTable) -> Int

table_select_columns(table : CsvTable, columns : Array[String]) -> CsvTable

table_drop_columns(table : CsvTable, columns : Array[String]) -> CsvTable

table_rename_column(table : CsvTable, old_name : String, new_name : String) -> CsvTable

table_filter_eq(table : CsvTable, column : String, value : String) -> CsvTable

table_sort_by_column(table : CsvTable, column : String) -> CsvTable

table_fill_empty(table : CsvTable, default_value : String) -> CsvTable

table_deduplicate(table : CsvTable) -> CsvTable

column_numeric_summary(table : CsvTable, column : String) -> CsvNumericSummary

column_sum(table : CsvTable, column : String) -> Double

column_average(table : CsvTable, column : String) -> Double?

table_group_count(table : CsvTable, group_column : String) -> CsvTable

table_group_sum(table : CsvTable, group_column : String, value_column : String) -> CsvTable

table_to_html(table : CsvTable) -> String

profile_report_markdown(table : CsvTable) -> String

quality_report_html(table : CsvTable, errors : Array[CsvValidationError]) -> String

validate_required_columns(table : CsvTable, columns : Array[String]) -> Array[CsvValidationError]

validate_row_widths(table : CsvTable) -> Array[CsvValidationError]

validate_min_number(table : CsvTable, column : String, minimum : Double) -> Array[CsvValidationError]

validate_max_number(table : CsvTable, column : String, maximum : Double) -> Array[CsvValidationError]

validate_allowed_values(table : CsvTable, column : String, allowed : Array[String], required : Bool) -> Array[CsvValidationError]

validate_unique_key(table : CsvTable, columns : Array[String]) -> Array[CsvDuplicateKeyError]

table_inner_join(left : CsvTable, right : CsvTable, left_key : String, right_key : String) -> CsvTable

table_left_join(left : CsvTable, right : CsvTable, left_key : String, right_key : String) -> CsvTable

table_union_by_name(left : CsvTable, right : CsvTable) -> CsvTable

table_transpose(table : CsvTable) -> CsvTable

table_drop_empty_rows(table : CsvTable) -> CsvTable

table_drop_empty_columns(table : CsvTable) -> CsvTable

table_replace_value(table : CsvTable, old_value : String, new_value : String) -> CsvTable

table_coalesce_columns(table : CsvTable, columns : Array[String], target : String) -> CsvTable

table_normalize_boolean(table : CsvTable, column : String) -> CsvTable

table_missing_summary(table : CsvTable) -> CsvTable

#Example

import {
"clhhhhh/moon-csv-lite" @csv,
}

fn main {
let text = "name,age\nAlice,18\nBob,20"
let rows = @csv.parse(text)
let output = @csv.stringify(rows)
println(output)
}

Output:

name,age Alice,18 Bob,20

#Dialects

let rows = @csv.parse_with_dialect("name\tage\nAlice\t18", @csv.tsv_dialect())
let dialect = { delimiter: ';', newline: "\r\n", skip_empty_lines: false }
let output = @csv.stringify_with_dialect(rows, dialect)

#Table Export

let table = @csv.parse_table("name,note\nAlice,\"hello, world\"")
println(@csv.table_to_markdown(table))
println(@csv.table_to_json_lines(table))

Markdown output:

| name | note | | --- | --- | | Alice | hello, world |

JSON Lines output:

{"name":"Alice","note":"hello, world"}

#Checked Parsing

let report = @csv.parse_table_checked("name,age\nAlice,18,extra")
println(@csv.parse_issues_to_text(report.issues))

Output:

line 2, column 1: expected 2 fields, got 3

#Dialect Detection And Schema Inference

let input = "name;age;active\nAlice;18;true\nBob;20;false"
let dialect = @csv.sniff_dialect(input)
let table = @csv.parse_table_auto(input)
let rules = @csv.infer_validation_rules(table)
println(@csv.dialect_name(dialect))
println(@csv.table_schema_markdown(table))
println(@csv.validation_errors_to_text(@csv.validate_table(table, rules)))

#Audit Report

let report = @csv.audit_csv("name,age\nAlice,18\nBob,")
println(@csv.audit_status_text(report))
println(@csv.audit_quality_score_text(@csv.audit_quality_score(report)))
println(@csv.audit_report_markdown(report))

The audit workflow combines dialect detection, checked parsing, table-level quality issues, schema inference, missing-value summaries, and column profiling into Markdown, HTML, or JSON reports. It also computes a 0-100 quality score with grade, risk, structure, completeness, consistency, and uniqueness dimensions. Use audit_csv_json or the CLI audit-json command when CI or another script needs a stable machine-readable summary.

#Data Passport

let input = "order_id,region,amount\nSO-1,east,10\nSO-2,west,20"
println(@csv.csv_data_passport_markdown(input, "sales-dataset"))
println(@csv.csv_data_passport_json(input, "sales-dataset"))

A CSV Data Passport is a compact identity card for a dataset. It combines the detected dialect, row/column/cell counts, a stable shape fingerprint, quality score, missing-cell count, schema summary, column metadata, and recommendations. It is intended for code review, release notes, CI artifacts, and data assets that should be easy to inspect without reading the whole CSV file.

#Chart Preview

let input = "region,amount\nEast,120.5\nWest,88\nEast,130"
println(@csv.chart_csv_json(input, "bar"))
println(@csv.chart_csv_svg(input, "line"))
println(@csv.chart_csv_html(input, "pie"))

The chart workflow auto-detects the CSV dialect, chooses a label column and a numeric value column, aggregates duplicate labels by sum, and falls back to category counts when no numeric column exists. The reusable CsvChartSpec model can be exported as JSON for frontends, SVG for direct embedding, or HTML for standalone previews.

#Drift Report

let baseline = "name,age\nAlice,18\nBob,20"
let candidate = "name,age\nAlice,18\nBob,"
println(@csv.audit_drift_markdown(baseline, candidate))
println(@csv.audit_drift_json(baseline, candidate))

Drift reports compare two CSV snapshots and highlight quality score changes, row/column shape changes, added or removed columns, inferred type changes, and missing-value regressions.

#Quality Gate

let baseline = "name,age\nAlice,18\nBob,20"
let candidate = "name,age\nAlice,18\nBob,"
let report = @csv.audit_quality_gate_default(baseline, candidate)
println(@csv.audit_quality_gate_text(report))
println(@csv.audit_quality_gate_report_markdown(report))

Quality gates turn CSV drift into a release decision. The default policy fails when candidate score drops too far, score falls below the minimum, columns are removed, inferred types change, missing values increase, or the candidate has too many quality issues. Use this when CSV files behave like configuration, reference data, or data exports that should not regress silently.

#Quality Contract

let sample = "order_id,region,amount\nSO-1,east,10\nSO-2,west,20"
let contract_csv = @csv.quality_contract_infer_csv(sample)
println(contract_csv)
println(@csv.audit_quality_contract_markdown(sample, contract_csv))

Contracts are small CSV documents with rule,column,value,extra columns. They can require columns, enforce minimum quality scores, limit parse and quality issues, set row-count bounds, validate column types, check numeric ranges, restrict allowed values, and require unique keys. This is useful when a CSV file acts like a release asset: game configuration, product data, experiment parameters, measurement exports, or a shared spreadsheet that should not drift silently.

#Validation And Profiling

let table = @csv.parse_table("name,age,active\nAlice,18,true\nBob,nope,false")
let rules = [
{ name: "name", kind: Text, required: true },
{ name: "age", kind: Integer, required: true },
{ name: "active", kind: Boolean, required: true },
]
let errors = @csv.validate_table(table, rules)
let profiles = @csv.profile_table(table)
println(@csv.validation_errors_to_text(errors))
println(@csv.profile_report(table))

Run a complete validation/report demo:

moon run examples/quality-report

#Table Operations And Aggregation

let table = @csv.parse_table("team,score\nA,10\nB,20\nA,15")
let selected = @csv.table_select_columns(table, ["team", "score"])
let sorted = @csv.table_sort_by_column(selected, "team")
let grouped = @csv.table_group_sum(sorted, "team", "score")
println(@csv.table_to_markdown(grouped))

#Advanced Validation And Joins

let people = @csv.parse_table("id,name\n1,Alice\n2,Bob")
let cities = @csv.parse_table("id,city\n1,Shenzhen\n2,Shanghai")
let joined = @csv.table_left_join(people, cities, "id", "id")
let errors = @csv.validate_unique_key(joined, ["id"])
println(@csv.table_to_markdown(joined))
println(@csv.duplicate_key_errors_to_text(errors))

Output:

| team | sum_score | | --- | --- | | A | 25 | | B | 20 |

#CLI

moon run cmd/csvlite -- audit "name,age\nAlice,18\nBob," moon run cmd/csvlite -- audit-html "name,age\nAlice,18" moon run cmd/csvlite -- audit-json "name,age\nAlice,18\nBob," moon run cmd/csvlite -- chart-json "team,score\nA,10\nB,20\nA,15" moon run cmd/csvlite -- chart-svg "day,revenue\nMon,10\nTue,20" line day revenue moon run cmd/csvlite -- chart-html "city,status\nShenzhen,ok\nShanghai,ok\nShenzhen,retry" moon run cmd/csvlite -- sniff "name;age\nAlice;18" moon run cmd/csvlite -- schema "name,age\nAlice,18\nBob,20" moon run cmd/csvlite -- score "name,age\nAlice,18\nBob," moon run cmd/csvlite -- drift "name,age\nAlice,18\nBob,20" "name,age\nAlice,18\nBob," moon run cmd/csvlite -- drift-json "name,age\nAlice,18\nBob,20" "name,age\nAlice,18\nBob," moon run cmd/csvlite -- gate "name,age\nAlice,18\nBob,20" "name,age\nAlice,18\nBob," moon run cmd/csvlite -- gate-json "name,age\nAlice,18\nBob,20" "name,age\nAlice,18\nBob," moon run cmd/csvlite -- infer-contract "id,amount,paid\nA,10,true\nB,20,false" moon run cmd/csvlite -- contract "order_id,region,amount\nSO-1,east,10\nSO-2,west,20" "rule,column,value,extra\nname,*,sales-contract,\nmin_score,*,95,\nrequired,order_id,,\ntype,amount,float,required\nmin,amount,0,\nunique,order_id,," moon run cmd/csvlite -- contract-json "order_id,region,amount\nSO-1,east,10\nSO-2,west,20" "rule,column,value,extra\nname,*,sales-contract,\nmin_score,*,95,\nrequired,order_id,,\ntype,amount,float,required\nmin,amount,0,\nunique,order_id,," moon run cmd/csvlite -- passport "order_id,region,amount\nSO-1,east,10\nSO-2,west,20" sales-dataset moon run cmd/csvlite -- passport-json "order_id,region,amount\nSO-1,east,10\nSO-2,west,20" sales-dataset moon run cmd/csvlite -- profile "name,age\nAlice,18" moon run cmd/csvlite -- check "name,age\nAlice,18,extra" moon run cmd/csvlite -- markdown "name,age\nAlice,18" moon run cmd/csvlite -- jsonl "name,age\nAlice,18" moon run cmd/csvlite -- group-sum "team,score\nA,10\nB,20\nA,15" team score moon run cmd/csvlite -- select "name,age,city\nAlice,18,Shenzhen" city,name moon run cmd/csvlite -- missing "name,age\nAlice,18\nBob,"

The CLI accepts \n, \r, and \t escape sequences in the CSV text argument so examples remain shell-friendly on Windows and Unix-like systems. For local files, use the file wrapper script:

.\scripts\audit-file.ps1 "C:\path\to\data.csv" .\scripts\audit-file.ps1 "C:\path\to\data.csv" -OutputFormat json .\scripts\audit-file.ps1 "C:\path\to\data.csv" -OutputFormat html > report.html

The file wrapper runs a full audit for small files. For larger files it reads a safe sampled prefix by default, prints Audit mode: sample, and explains that the report describes the sampled rows. Tune this with -MaxRows and -MaxChars; use -Full only for files small enough to fit the safe command limit.

#Fixture Test Set

The repository includes a small realistic fixture set under fixtures/. These files are intentionally tiny so they are easy to inspect in reviews and CI logs, but each one targets a different behavior:

fixtureformatpurpose
fixtures/people-clean.csvCSVclean data with text, integer, boolean, and city columns
fixtures/people-missing.csvCSVmissing value detection and optional schema fields
fixtures/bad-width.csvCSVrow-width mismatch reporting
fixtures/quality-issues.csvCSVduplicate headers, empty header, all-empty column, empty row, and duplicate row reporting
fixtures/sales-semicolon.csvsemicolondialect sniffing and numeric schema inference
fixtures/logs.tsvTSVtab delimiter sniffing and log-like schema inference
fixtures/html-sensitive.csvCSVquoted commas and HTML escaping for audit reports

Run the fixture tests with:

.\scripts\test-fixtures.ps1

The script reads each fixture, invokes cmd/csvlite, and asserts key output such as Status: issues, inferred types, missing counts, detected delimiters, quality issue counts, JSON fields, and escaped HTML text. It also escapes fixture double quotes before passing content through the command line so quoted CSV fields remain intact. It also checks the sampled file audit wrapper used for larger local CSV files.

Regenerate the checked-in audit report examples with:

.\scripts\generate-example-reports.ps1

#RF Measurement Example

The examples/rf-measurement package demonstrates a realistic engineering CSV workflow using VNA-style columns:

freq_hz,s11_db,s21_db 1000000000,-12.5,-1.2 2000000000,-18.3,-0.8 3000000000,-9.7,-1.5

Run it with:

moon run examples/rf-measurement

#Supported CSV Behavior

  • Basic comma-separated fields: a,b,c
  • Empty fields: a,,c
  • Leading and trailing empty fields: ,a,
  • LF line endings: a,b\nc,d
  • CRLF line endings: a,b\r\nc,d
  • Quoted fields: "hello","world"
  • Commas in quoted fields: "hello, world",123
  • Newlines in quoted fields
  • Escaped double quotes: "He said ""Hi"""
  • TSV and semicolon-delimited data through CsvDialect
  • Optional skipped empty lines through CsvDialect
  • Configurable output newline, including CRLF

#Limitations

  • No streaming parser
  • No nested typed records
  • No DataFrame support
  • No Excel-specific dialect support
  • No database import/export tooling

#Project Structure

. +-- cmd/csvlite/ # command-line CSV utility +-- cmd/main/ # runnable demo +-- CONTRIBUTING.md # contribution and development guide +-- docs/api.md # grouped API guide +-- docs/architecture.md # module design overview +-- docs/commit-plan.md # suggested public commit split +-- docs/cookbook.md # task-oriented usage recipes +-- docs/examples/ # checked-in audit report examples +-- docs/release.md # release and mooncakes publishing checklist +-- docs/roadmap.md # project roadmap +-- docs/why-moonbit.md # ecosystem value notes +-- examples/basic/ # minimal usage example +-- examples/data-audit/ # end-to-end audit workflow example +-- examples/quality-report/ # validation and profiling report example +-- examples/rf-measurement/ # engineering CSV example +-- fixtures/ # realistic CSV/TSV fixture test set +-- playground/ # static browser CSV audit workbench using MoonBit JS output +-- web/ # MoonBit browser adapter compiled to JavaScript +-- scripts/build-playground-engine.ps1 # build and copy MoonBit JS playground bundle +-- scripts/check-playground.ps1 # headless browser playground smoke test +-- scripts/generate-example-reports.ps1 # refresh docs/examples from fixtures +-- scripts/audit-file.ps1 # file-path wrapper with safe sampling for large CSVs +-- scripts/status.ps1 # compact local project status summary +-- scripts/test-fixtures.ps1 # fixture-based CLI smoke tests +-- scripts/verify.ps1 # full local verification flow +-- aggregation.mbt # column stats and group-by summaries +-- audit_report.mbt # end-to-end CSV audit reports +-- chart_preview.mbt # chart JSON/SVG/HTML preview generation +-- data_passport.mbt # CSV Data Passport identity and quality artifact +-- data_cleaning.mbt # missing data and value normalization helpers +-- dialect_sniff.mbt # delimiter and newline detection helpers +-- drift_report.mbt # baseline vs candidate CSV drift reports +-- html_export.mbt # HTML and Markdown report exports +-- join_ops.mbt # joins, union, append, transpose, anti-join +-- moon-csv-lite.mbt # parser, writer, validation, profiling, exports +-- moon-csv-lite_wbtest.mbt +-- parse_result.mbt # recoverable parse issue reporting +-- quality_gate.mbt # baseline/candidate quality gate decisions +-- quality_contract.mbt # reusable CSV quality contract workflow +-- schema_infer.mbt # inferred schema and validation rules +-- schema_rules.mbt # advanced validation helpers +-- table_ops.mbt # reusable table transformations +-- moon.mod +-- README.md

#Development

moon fmt moon check moon test moon run examples/basic moon run examples/data-audit moon run examples/quality-report moon run examples/rf-measurement moon run cmd/csvlite -- audit "name,age\nAlice,18\nBob," moon run cmd/csvlite -- audit-json "name,age\nAlice,18\nBob," moon run cmd/csvlite -- chart-json "team,score\nA,10\nB,20\nA,15" moon run cmd/csvlite -- chart-svg "day,revenue\nMon,10\nTue,20" line day revenue moon run cmd/csvlite -- sniff "name;age\nAlice;18" moon run cmd/csvlite -- schema "name,age\nAlice,18\nBob,20" moon run cmd/csvlite -- score "name,age\nAlice,18\nBob," moon run cmd/csvlite -- drift "name,age\nAlice,18\nBob,20" "name,age\nAlice,18\nBob," moon run cmd/csvlite -- gate "name,age\nAlice,18\nBob,20" "name,age\nAlice,18\nBob," moon run cmd/csvlite -- passport "id,amount\nA,10\nB," release-dataset moon run cmd/csvlite -- check "name,age\nAlice,18,extra" moon run cmd/csvlite -- group-sum "team,score\nA,10\nB,20\nA,15" team score .\scripts\audit-file.ps1 .\fixtures\quality-issues.csv .\scripts\test-fixtures.ps1 .\scripts\generate-example-reports.ps1 .\scripts\build-playground-engine.ps1 .\scripts\check-playground.ps1 .\scripts\status.ps1

On Windows, the same verification flow is available as:

.\scripts\verify.ps1

#Publishing

The package is designed to be published to mooncakes.io with MoonBit's built-in package manager:

moon login moon whoami moon publish --dry-run moon publish

moon publish --dry-run requires a logged-in Mooncakes account. If it reports a missing credentials file, run moon login first and confirm the expected owner with moon whoami.

#Contest Note

This project is built as a MoonBit ecosystem package for the OSC2026 open source contest. The goal is to provide a focused, testable, publishable toolkit for CSV data exchange, validation, and lightweight analysis.

#License

MIT

#
ColumnProfile

pub(all) struct ColumnProfile {
name : String
total : Int
empty : Int
non_empty : Int
unique : Int
inferred : CsvInferredType
min : Double?
max : Double?
average : Double?
} derive(Eq,
Debug
)

Summary statistics for a single CSV column.

#
CsvAuditQualityIssue

pub(all) struct CsvAuditQualityIssue {
severity : String
row : Int
column : String
message : String
} derive(Eq,
Debug
)

A table-level data quality issue discovered during audit.

#
CsvAuditRecommendation

pub(all) struct CsvAuditRecommendation {
severity : String
message : String
} derive(Eq,
Debug
)

A data-quality recommendation produced by the audit workflow.

#
CsvAuditReport

pub(all) struct CsvAuditReport {
dialect : CsvDialect
table : CsvTable
parse_issues : Array[CsvParseError]
quality_issues : Array[CsvAuditQualityIssue]
inferred_schema : Array[CsvInferredColumnRule]
missing_summary : CsvTable
profiles : Array[ColumnProfile]
} derive(Eq,
Debug
)

A complete CSV audit assembled from parsing, dialect detection, schema inference, missing-value statistics, and column profiling.

#
CsvAuditScore

pub(all) struct CsvAuditScore {
score : Int
grade : String
risk : String
structure_score : Int
completeness_score : Int
consistency_score : Int
uniqueness_score : Int
issue_penalty : Int
missing_cells : Int
total_cells : Int
} derive(Eq,
Debug
)

Numeric quality score for an audit report.

The score is intentionally compact enough for CLI/CI output while still exposing the dimensions used to calculate the final grade.

#
CsvChartPoint

pub(all) struct CsvChartPoint {
label : String
value : Double
count : Int
} derive(Eq,
Debug
)

A single point in a generated chart preview.

#
CsvChartSpec

pub(all) struct CsvChartSpec {
kind : String
title : String
label_column : String
value_column : String
measure : String
points : Array[CsvChartPoint]
skipped_rows : Int
warnings : Array[String]
} derive(Eq,
Debug
)

Data model used by JSON, SVG, HTML, CLI, and browser chart previews.

#
CsvColumnRule

pub(all) struct CsvColumnRule {
name : String
kind : CsvColumnType
required : Bool
} derive(Eq,
Debug
)

A single column validation rule.

#
CsvColumnType

pub(all) enum CsvColumnType {
Text
Integer
Float
Boolean
} derive(Eq,
Debug
)

Supported schema validation types.

#
CsvContractAllowedValuesRule

pub(all) struct CsvContractAllowedValuesRule {
column : String
allowed : Array[String]
required : Bool
} derive(Eq,
Debug
)

Allowed-value rule used by CSV quality contracts.

#
CsvContractIssue

pub(all) struct CsvContractIssue {
severity : String
rule : String
row : Int
column : String
message : String
} derive(Eq,
Debug
)

One contract violation or advisory.

#
CsvContractNumberRule

pub(all) struct CsvContractNumberRule {
column : String
value : Double
} derive(Eq,
Debug
)

Numeric threshold rule used by CSV quality contracts.

#
CsvContractReport

pub(all) struct CsvContractReport {
passed : Bool
contract : CsvQualityContract
audit : CsvAuditReport
score : CsvAuditScore
issues : Array[CsvContractIssue]
} derive(Eq,
Debug
)

Contract evaluation result for one CSV input.

#
CsvContractUniqueKeyRule

pub(all) struct CsvContractUniqueKeyRule {
columns : Array[String]
} derive(Eq,
Debug
)

Unique-key rule used by CSV quality contracts.

#
CsvDataPassport

pub(all) struct CsvDataPassport {
name : String
fingerprint : String
dialect : String
rows : Int
columns : Int
cells : Int
missing_cells : Int
parse_issues : Int
quality_issues : Int
required_columns : Int
optional_columns : Int
numeric_columns : Int
boolean_columns : Int
text_columns : Int
unique_columns : Int
score : CsvAuditScore
schema : Array[CsvInferredColumnRule]
recommendations : Array[CsvAuditRecommendation]
} derive(Eq,
Debug
)

A compact, reusable identity card for one CSV dataset.

The passport combines structural metadata, data-quality scoring, schema inference, recommendations, and a stable shape fingerprint into one artifact that can be stored in docs, release notes, or CI logs.

#
CsvDialect

pub(all) struct CsvDialect {
delimiter : Char
newline : String
skip_empty_lines : Bool
} derive(Eq,
Debug
)

CSV dialect options for parsing and writing related tabular text formats.

#
CsvDialectCandidate

pub(all) struct CsvDialectCandidate {
name : String
delimiter : Char
rows : Int
columns : Int
consistent_rows : Int
empty_cells : Int
score : Int
} derive(Eq,
Debug
)

One candidate considered by the dialect sniffer.

#
CsvDriftIssue

pub(all) struct CsvDriftIssue {
severity : String
category : String
column : String
message : String
} derive(Eq,
Debug
)

One issue found while comparing two CSV audit snapshots.

#
CsvDriftReport

pub(all) struct CsvDriftReport {
baseline : CsvAuditReport
candidate : CsvAuditReport
baseline_score : CsvAuditScore
candidate_score : CsvAuditScore
score_delta : Int
row_delta : Int
column_delta : Int
issues : Array[CsvDriftIssue]
} derive(Eq,
Debug
)

Drift report comparing a baseline CSV and a candidate CSV.

#
CsvDuplicateKeyError

pub(all) struct CsvDuplicateKeyError {
first_row : Int
duplicate_row : Int
key : String
} derive(Eq,
Debug
)

A duplicate key issue reported by validate_unique_key.

#
CsvInferredColumnRule

pub(all) struct CsvInferredColumnRule {
name : String
kind : CsvColumnType
required : Bool
total : Int
empty : Int
unique : Int
examples : Array[String]
} derive(Eq,
Debug
)

Inferred validation metadata for one column.

#
CsvInferredType

pub(all) enum CsvInferredType {
EmptyOnly
IntegerColumn
FloatColumn
BooleanColumn
TextColumn
} derive(Eq,
Debug
)

Inferred type for a profiled column.

#
CsvNumericSummary

pub(all) struct CsvNumericSummary {
count : Int
sum : Double
average : Double?
min : Double?
max : Double?
} derive(Eq,
Debug
)

Numeric summary for one column or one group.

#
CsvParseError

pub(all) struct CsvParseError {
message : String
line : Int
column : Int
} derive(Eq,
Debug
)

A structural CSV parse issue with one-based line and column positions.

#
CsvParseReport

pub(all) struct CsvParseReport {
rows : Array[Array[String]]
issues : Array[CsvParseError]
} derive(Eq,
Debug
)

A checked parse result containing parsed rows and recoverable issues.

#
CsvQualityContract

pub(all) struct CsvQualityContract {
name : String
min_score : Int
max_parse_issues : Int
max_quality_issues : Int
min_rows : Int
max_rows : Int
required_columns : Array[String]
column_rules : Array[CsvColumnRule]
min_number_rules : Array[CsvContractNumberRule]
max_number_rules : Array[CsvContractNumberRule]
allowed_values_rules : Array[CsvContractAllowedValuesRule]
unique_key_rules : Array[CsvContractUniqueKeyRule]
} derive(Eq,
Debug
)

A reusable CSV data-quality contract.

Contracts are intentionally higher level than parser settings. They describe what a CSV asset must look like before it is trusted by a release, CI job, or data import workflow.

#
CsvQualityGateIssue

pub(all) struct CsvQualityGateIssue {
severity : String
rule : String
column : String
message : String
} derive(Eq,
Debug
)

One policy violation or advisory emitted by the quality gate.

#
CsvQualityGateOptions

pub(all) struct CsvQualityGateOptions {
min_score : Int
max_score_drop : Int
max_quality_issues : Int
allow_new_columns : Bool
allow_removed_columns : Bool
allow_type_changes : Bool
allow_missing_increase : Bool
} derive(Eq,
Debug
)

Quality gate policy for baseline/candidate CSV comparisons.

This is designed for CI and release checks: the drift report explains what changed, while the gate decides whether the candidate CSV should pass.

#
CsvQualityGateReport

pub(all) struct CsvQualityGateReport {
passed : Bool
options : CsvQualityGateOptions
drift : CsvDriftReport
issues : Array[CsvQualityGateIssue]
} derive(Eq,
Debug
)

Quality gate decision for a candidate CSV compared with a baseline CSV.

#
CsvTable

pub(all) struct CsvTable {
headers : Array[String]
rows : Array[Array[String]]
} derive(Eq,
Debug
)

Header-aware table view over CSV rows.

#
CsvTableParseReport

pub(all) struct CsvTableParseReport {
table : CsvTable
issues : Array[CsvParseError]
} derive(Eq,
Debug
)

A checked table parse result.

#
CsvValidationError

pub(all) struct CsvValidationError {
row : Int
column : String
message : String
} derive(Eq,
Debug
)

A validation issue with one-based CSV row numbering.

#
audit_csv

fn audit_csv(input : String) -> CsvAuditReport

Audit CSV text using the automatically detected dialect.

#
audit_csv_html

fn audit_csv_html(input : String) -> String

Audit CSV text and render HTML in one step.

#
audit_csv_json

fn audit_csv_json(input : String) -> String

Audit CSV text and render machine-readable JSON in one step.

#
audit_csv_markdown

fn audit_csv_markdown(input : String) -> String

Audit CSV text and render Markdown in one step.

#
audit_csv_score

fn audit_csv_score(input : String) -> CsvAuditScore

Audit CSV text and return only the quality score model.

#
audit_csv_with_dialect

fn audit_csv_with_dialect(input : String, dialect : CsvDialect) -> CsvAuditReport

Audit CSV text using an explicit dialect.

#
audit_drift

fn audit_drift(baseline_input : String, candidate_input : String) -> CsvDriftReport

Compare two CSV snapshots and report schema, score, and completeness drift.

#
audit_drift_json

fn audit_drift_json(baseline_input : String, candidate_input : String) -> String

Compare two CSV snapshots and render JSON.

#
audit_drift_markdown

fn audit_drift_markdown(baseline_input : String, candidate_input : String) -> String

Compare two CSV snapshots and render Markdown.

#
audit_drift_report_json

fn audit_drift_report_json(report : CsvDriftReport) -> String

Render a drift report as compact JSON.

#
audit_drift_report_markdown

fn audit_drift_report_markdown(report : CsvDriftReport) -> String

Render a drift report as Markdown.

#
audit_drift_text

fn audit_drift_text(report : CsvDriftReport) -> String

Render a compact text summary for CLI and logs.

#
audit_quality_contract

fn audit_quality_contract(input : String, contract : CsvQualityContract) -> CsvContractReport

Evaluate CSV text against a parsed quality contract.

#
audit_quality_contract_json

fn audit_quality_contract_json(input : String, contract_csv : String) -> String

Parse a contract CSV, evaluate CSV text, and render JSON.

#
audit_quality_contract_markdown

fn audit_quality_contract_markdown(input : String, contract_csv : String) -> String

Parse a contract CSV, evaluate CSV text, and render Markdown.

#
audit_quality_contract_report

fn audit_quality_contract_report(audit : CsvAuditReport, contract : CsvQualityContract) -> CsvContractReport

Evaluate an audit report against a quality contract.

#
audit_quality_contract_report_json

fn audit_quality_contract_report_json(report : CsvContractReport) -> String

Render a contract report as compact JSON.

#
audit_quality_contract_report_markdown

fn audit_quality_contract_report_markdown(report : CsvContractReport) -> String

Render a contract report as Markdown.

#
audit_quality_gate

fn audit_quality_gate(baseline_input : String, candidate_input : String, options : CsvQualityGateOptions) -> CsvQualityGateReport

Run a quality gate with explicit options.

#
audit_quality_gate_default

fn audit_quality_gate_default(baseline_input : String, candidate_input : String) -> CsvQualityGateReport

Run the default quality gate.

#
audit_quality_gate_json

fn audit_quality_gate_json(baseline_input : String, candidate_input : String) -> String

Run the default quality gate and render JSON.

#
audit_quality_gate_markdown

fn audit_quality_gate_markdown(baseline_input : String, candidate_input : String) -> String

Run the default quality gate and render Markdown.

#
audit_quality_gate_report_json

fn audit_quality_gate_report_json(report : CsvQualityGateReport) -> String

Render a quality gate report as compact JSON.

#
audit_quality_gate_report_markdown

fn audit_quality_gate_report_markdown(report : CsvQualityGateReport) -> String

Render a quality gate report as Markdown.

#
audit_quality_gate_text

fn audit_quality_gate_text(report : CsvQualityGateReport) -> String

Render a compact one-line quality gate summary.

#
audit_quality_issues

fn audit_quality_issues(table : CsvTable) -> Array[CsvAuditQualityIssue]

Discover table-level quality issues that are not parser errors.

#
audit_quality_issues_markdown

fn audit_quality_issues_markdown(issues : Array[CsvAuditQualityIssue]) -> String

Render audit quality issues as Markdown.

#
audit_quality_score

fn audit_quality_score(report : CsvAuditReport) -> CsvAuditScore

Calculate a 0-100 quality score for an audit report.

Dimensions:
  • structure: parser/row-shape health
  • completeness: non-empty cell coverage
  • consistency: header and table-shape hygiene
  • uniqueness: duplicate-row risk

#
audit_quality_score_text

fn audit_quality_score_text(score : CsvAuditScore) -> String

Render the quality score as a compact CLI line.

#
audit_recommendations

fn audit_recommendations(report : CsvAuditReport) -> Array[CsvAuditRecommendation]

Generate actionable recommendations from audit findings.

#
audit_recommendations_markdown

fn audit_recommendations_markdown(report : CsvAuditReport) -> String

Render audit recommendations as Markdown.

#
audit_report_html

fn audit_report_html(report : CsvAuditReport) -> String

Render a complete audit report as a standalone HTML document.

#
audit_report_json

fn audit_report_json(report : CsvAuditReport) -> String

Render a complete audit report as machine-readable JSON for scripts and CI.

#
audit_report_markdown

fn audit_report_markdown(report : CsvAuditReport) -> String

Render a complete audit report as Markdown.

#
audit_report_ok

fn audit_report_ok(report : CsvAuditReport) -> Bool

Return true when the audit found no parse or table-quality issues.

#
audit_status_text

fn audit_status_text(report : CsvAuditReport) -> String

Render a compact status line for terminal use.

#
chart_auto_spec

fn chart_auto_spec(table : CsvTable, kind : String) -> CsvChartSpec

Build an automatic chart spec from a parsed table.

#
chart_count_spec

fn chart_count_spec(table : CsvTable, kind : String, label_column : String) -> CsvChartSpec

Build a category-count chart when no numeric column is available.

#
chart_csv_html

fn chart_csv_html(input : String, kind : String) -> String

Render an automatic chart preview as a standalone HTML document.

#
chart_csv_html_with_columns

fn chart_csv_html_with_columns(input : String, kind : String, label_column : String, value_column : String) -> String

Render a chart preview with explicit columns as a standalone HTML document.

#
chart_csv_json

fn chart_csv_json(input : String, kind : String) -> String

Render an automatic chart spec as machine-readable JSON.

#
chart_csv_json_with_columns

fn chart_csv_json_with_columns(input : String, kind : String, label_column : String, value_column : String) -> String

Render a chart spec with explicit columns as machine-readable JSON.

#
chart_csv_spec

fn chart_csv_spec(input : String) -> CsvChartSpec

Build an automatic bar-chart preview from CSV text.

#
chart_csv_spec_kind

fn chart_csv_spec_kind(input : String, kind : String) -> CsvChartSpec

Build an automatic chart preview from CSV text.

Supported kinds are bar, line, and pie. Unknown values fall back to bar. The function chooses a label column and a numeric value column when possible; if no numeric column exists, it generates category counts.

#
chart_csv_spec_with_columns

fn chart_csv_spec_with_columns(input : String, kind : String, label_column : String, value_column : String) -> CsvChartSpec

Build a chart preview from CSV text with explicit label and value columns.

#
chart_csv_svg

fn chart_csv_svg(input : String, kind : String) -> String

Render an automatic chart preview as standalone SVG.

#
chart_csv_svg_with_columns

fn chart_csv_svg_with_columns(input : String, kind : String, label_column : String, value_column : String) -> String

Render a chart preview with explicit columns as standalone SVG.

#
chart_spec_html

fn chart_spec_html(spec : CsvChartSpec) -> String

Render a chart spec as a standalone HTML document.

#
chart_spec_json

fn chart_spec_json(spec : CsvChartSpec) -> String

Render a chart spec as machine-readable JSON.

#
chart_spec_svg

fn chart_spec_svg(spec : CsvChartSpec) -> String

Render a chart spec as standalone SVG.

#
chart_table_spec

fn chart_table_spec(table : CsvTable, kind : String, label_column : String, value_column : String) -> CsvChartSpec

Build a chart spec from explicit table columns. Duplicate labels are aggregated by summing values in first-seen order.

#
column_average

fn column_average(table : CsvTable, column : String) -> Double?

Return the average of numeric values in a column.

#
column_count_empty

fn column_count_empty(table : CsvTable, column : String) -> Int

Count empty or missing values in a column.

#
column_count_non_empty

fn column_count_non_empty(table : CsvTable, column : String) -> Int

Count non-empty values in a column.

#
column_examples

fn column_examples(table : CsvTable, column : String, limit : Int) -> Array[String]

Return first-seen non-empty examples for one column.

#
column_max

fn column_max(table : CsvTable, column : String) -> Double?

Return the maximum numeric value in a column.

#
column_min

fn column_min(table : CsvTable, column : String) -> Double?

Return the minimum numeric value in a column.

#
column_numeric_summary

fn column_numeric_summary(table : CsvTable, column : String) -> CsvNumericSummary

Summarize numeric values in a column, ignoring non-numeric and empty values.

#
column_sum

fn column_sum(table : CsvTable, column : String) -> Double

Return the sum of numeric values in a column.

#
column_summary_markdown

fn column_summary_markdown(table : CsvTable, column : String) -> String

Build a compact Markdown report for one numeric column.

#
column_unique_values

fn column_unique_values(table : CsvTable, column : String) -> Array[String]

Return unique non-empty values in first-seen order.

#
csv_data_passport

fn csv_data_passport(input : String, name : String) -> CsvDataPassport

Build a data passport from CSV text using automatic dialect detection.

#
csv_data_passport_from_audit

fn csv_data_passport_from_audit(audit : CsvAuditReport, name : String) -> CsvDataPassport

Build a data passport from an existing audit report.

#
csv_data_passport_json

fn csv_data_passport_json(input : String, name : String) -> String

Render a CSV data passport as compact JSON.

#
csv_data_passport_markdown

fn csv_data_passport_markdown(input : String, name : String) -> String

Render a CSV data passport as Markdown.

#
csv_data_passport_report_json

fn csv_data_passport_report_json(passport : CsvDataPassport) -> String

Render a prepared passport model as compact JSON.

#
csv_data_passport_report_markdown

fn csv_data_passport_report_markdown(passport : CsvDataPassport) -> String

Render a prepared passport model as Markdown.

#
default_dialect

fn default_dialect() -> CsvDialect

RFC-4180-style defaults used by parse and stringify.

#
dialect_name

fn dialect_name(dialect : CsvDialect) -> String

Return a readable name for a dialect.

#
duplicate_key_errors_to_text

fn duplicate_key_errors_to_text(errors : Array[CsvDuplicateKeyError]) -> String

Convert duplicate key errors into a human-readable report.

#
infer_schema

fn infer_schema(table : CsvTable) -> Array[CsvInferredColumnRule]

Infer schema metadata for every column in a header-aware table.

#
infer_schema_auto

fn infer_schema_auto(input : String) -> Array[CsvInferredColumnRule]

Infer schema from CSV text using automatic dialect detection.

#
infer_validation_rules

fn infer_validation_rules(table : CsvTable) -> Array[CsvColumnRule]

Infer ordinary validation rules from observed data.

#
inferred_type_name

fn inferred_type_name(kind : CsvInferredType) -> String

Human-readable name for an inferred column type.

#
parse

fn parse(input : String) -> Array[Array[String]]

Parse CSV text into rows and fields.

#
parse_auto

fn parse_auto(input : String) -> Array[Array[String]]

Parse rows with the most likely detected dialect.

#
parse_checked

fn parse_checked(input : String) -> CsvParseReport

Parse CSV and report recoverable structural issues.

#
parse_checked_with_dialect

fn parse_checked_with_dialect(input : String, dialect : CsvDialect) -> CsvParseReport

Parse delimited text and report recoverable structural issues.

#
parse_issues_to_markdown

fn parse_issues_to_markdown(issues : Array[CsvParseError]) -> String

Render parse issues as Markdown.

#
parse_issues_to_text

fn parse_issues_to_text(issues : Array[CsvParseError]) -> String

Render parse issues as a compact human-readable report.

#
parse_report_ok

fn parse_report_ok(report : CsvParseReport) -> Bool

Return true when a checked parse report has no issues.

#
parse_table

fn parse_table(input : String) -> CsvTable

Parse CSV text as a header-aware table.

#
parse_table_auto

fn parse_table_auto(input : String) -> CsvTable

Parse a header-aware table with the most likely detected dialect.

#
parse_table_checked

fn parse_table_checked(input : String) -> CsvTableParseReport

Parse a header-aware table and report recoverable structural issues.

#
parse_table_checked_with_dialect

fn parse_table_checked_with_dialect(input : String, dialect : CsvDialect) -> CsvTableParseReport

Parse a header-aware table with a custom dialect and report structural issues.

#
parse_table_with_dialect

fn parse_table_with_dialect(input : String, dialect : CsvDialect) -> CsvTable

Parse delimited text as a header-aware table with custom dialect options.

#
parse_with_dialect

fn parse_with_dialect(input : String, dialect : CsvDialect) -> Array[Array[String]]

Parse delimited text with custom dialect options.

#
pipe_dialect

fn pipe_dialect() -> CsvDialect

Pipe-separated value dialect.

#
profile_report

fn profile_report(table : CsvTable) -> String

Render a compact data quality report for a header-aware table.

#
profile_report_markdown

fn profile_report_markdown(table : CsvTable) -> String

Export a profile report as Markdown, suitable for README or issue comments.

#
profile_table

fn profile_table(table : CsvTable) -> Array[ColumnProfile]

Profile each column with counts, uniqueness, inferred type, and numeric stats.

#
quality_contract_default

fn quality_contract_default(name : String) -> CsvQualityContract

Create an empty, practical default contract.

#
quality_contract_from_csv

fn quality_contract_from_csv(input : String) -> CsvQualityContract

Parse a quality contract from a small CSV dialect.

Expected columns are rule,column,value,extra. The supported rules are: name, min_score, max_parse_issues, max_quality_issues, min_rows, max_rows, required, type, min, max, allowed, and unique.

#
quality_contract_infer_csv

fn quality_contract_infer_csv(input : String) -> String

Infer a starter quality contract from a representative CSV sample.

#
quality_contract_infer_report

fn quality_contract_infer_report(audit : CsvAuditReport, name : String) -> String

Infer a starter contract from an audit report.

#
quality_gate_default_options

fn quality_gate_default_options() -> CsvQualityGateOptions

Default policy: practical for data-regression checks in CI.

#
quality_gate_strict_options

fn quality_gate_strict_options() -> CsvQualityGateOptions

Strict policy: useful for stable configuration tables and release assets.

#
quality_report_html

fn quality_report_html(table : CsvTable, errors : Array[CsvValidationError]) -> String

Export a full quality report as HTML.

#
schema_inference_to_markdown

fn schema_inference_to_markdown(rules : Array[CsvInferredColumnRule]) -> String

Render inferred schema as a Markdown table.

#
schema_inference_to_text

fn schema_inference_to_text(rules : Array[CsvInferredColumnRule]) -> String

Render inferred schema as compact text for terminal output.

#
schema_inferred_required

fn schema_inferred_required(rules : Array[CsvInferredColumnRule], column : String) -> Bool

Return true if the inferred schema marks a column as required.

#
schema_inferred_type

fn schema_inferred_type(rules : Array[CsvInferredColumnRule], column : String) -> CsvColumnType?

Return the inferred scalar type for a column.

#
schema_validation_markdown

fn schema_validation_markdown(errors : Array[CsvValidationError]) -> String

Render a schema validation summary as Markdown.

#
semicolon_dialect

fn semicolon_dialect() -> CsvDialect

Semicolon-separated dialect used by some spreadsheet exports.

#
sniff_dialect

fn sniff_dialect(input : String) -> CsvDialect

Infer a likely dialect from comma, tab, semicolon, and pipe candidates.

#
sniff_dialect_markdown

fn sniff_dialect_markdown(input : String) -> String

Render the best candidate and score table as Markdown.

#
sniff_dialect_report

fn sniff_dialect_report(input : String) -> Array[CsvDialectCandidate]

Return all dialect candidates with scoring details.

#
sniff_dialect_summary

fn sniff_dialect_summary(input : String) -> String

Render a compact dialect summary for CLI output.

#
stringify

fn stringify(rows : Array[Array[String]]) -> String

Write rows and fields back to CSV text.

#
stringify_with_dialect

fn stringify_with_dialect(rows : Array[Array[String]], dialect : CsvDialect) -> String

Write rows and fields back to delimited text with custom dialect options.

#
table_add_column

fn table_add_column(table : CsvTable, column : String, compute : (Array[String]) -> String) -> CsvTable

Add a computed column. The callback receives each original row.

#
table_anti_join

fn table_anti_join(left : CsvTable, right : CsvTable, left_key : String, right_key : String) -> CsvTable

Return a table containing only rows that do not have a matching key in right.

#
table_append

fn table_append(table : CsvTable, bottom : CsvTable) -> CsvTable

Append rows from bottom to top when both tables share exactly the same headers.

#
table_coalesce_columns

fn table_coalesce_columns(table : CsvTable, columns : Array[String], target : String) -> CsvTable

Add a target column containing the first non-empty value among source columns.

#
table_column_count

fn table_column_count(table : CsvTable) -> Int

Return the number of columns declared by the table header.

#
table_deduplicate

fn table_deduplicate(table : CsvTable) -> CsvTable

Remove duplicate rows while preserving the first occurrence.

#
table_drop_columns

fn table_drop_columns(table : CsvTable, columns : Array[String]) -> CsvTable

Drop the requested columns while preserving all other columns in their original order.

#
table_drop_empty_columns

fn table_drop_empty_columns(table : CsvTable) -> CsvTable

Drop columns where every row is empty or missing.

#
table_drop_empty_rows

fn table_drop_empty_rows(table : CsvTable) -> CsvTable

Drop rows where every declared column is empty or missing.

#
table_drop_rows

fn table_drop_rows(table : CsvTable, count : Int) -> CsvTable

Drop the first count rows.

#
table_fill_empty

fn table_fill_empty(table : CsvTable, default_value : String) -> CsvTable

Replace empty or missing cells with a default value and pad all rows to header width.

#
table_filter_eq

fn table_filter_eq(table : CsvTable, column : String, value : String) -> CsvTable

Filter rows whose column value equals the provided value.

#
table_filter_not_empty

fn table_filter_not_empty(table : CsvTable, column : String) -> CsvTable

Filter rows for which the target column is present and not empty.

#
table_get

fn table_get(table : CsvTable, row_index : Int, column : String) -> String?

Look up a table cell by zero-based row index and header name.

#
table_group_average

fn table_group_average(table : CsvTable, group_column : String, value_column : String) -> CsvTable

Average numeric values per group and return a two-column table.

#
table_group_count

fn table_group_count(table : CsvTable, group_column : String) -> CsvTable

Count rows per group value and return a two-column table.

#
table_group_sum

fn table_group_sum(table : CsvTable, group_column : String, value_column : String) -> CsvTable

Sum numeric values per group and return a two-column table.

#
table_inner_join

fn table_inner_join(left : CsvTable, right : CsvTable, left_key : String, right_key : String) -> CsvTable

Inner join two tables by key columns.

#
table_left_join

fn table_left_join(left : CsvTable, right : CsvTable, left_key : String, right_key : String) -> CsvTable

Left join two tables by key columns, preserving every row from the left table.

#
table_limit

fn table_limit(table : CsvTable, count : Int) -> CsvTable

Return at most the first count rows.

#
table_lowercase_column

fn table_lowercase_column(table : CsvTable, column : String) -> CsvTable

Convert values in one column to lowercase.

#
table_missing_summary

fn table_missing_summary(table : CsvTable) -> CsvTable

Build a per-column missingness summary table.

#
table_normalize_boolean

fn table_normalize_boolean(table : CsvTable, column : String) -> CsvTable

Normalize common boolean spellings to true or false in one column.

#
table_normalize_headers

fn table_normalize_headers(table : CsvTable) -> CsvTable

Normalize headers by trimming whitespace, lowercasing, and replacing spaces with underscores.

#
table_parse_report_ok

fn table_parse_report_ok(report : CsvTableParseReport) -> Bool

Return true when a checked table parse report has no issues.

#
table_rename_column

fn table_rename_column(table : CsvTable, old_name : String, new_name : String) -> CsvTable

Rename a column. If the column is absent, the table is returned unchanged.

#
table_reorder_columns

fn table_reorder_columns(table : CsvTable, columns : Array[String]) -> CsvTable

Return a table with columns reordered according to columns, then remaining columns.

#
table_replace_in_column

fn table_replace_in_column(table : CsvTable, column : String, old_value : String, new_value : String) -> CsvTable

Replace exact cell values in one column.

#
table_replace_value

fn table_replace_value(table : CsvTable, old_value : String, new_value : String) -> CsvTable

Replace exact cell values in the whole table.

#
table_row_count

fn table_row_count(table : CsvTable) -> Int

Return the number of data rows in a header-aware table.

#
table_schema_markdown

fn table_schema_markdown(table : CsvTable) -> String

Render inferred schema for a table as Markdown.

#
table_schema_text

fn table_schema_text(table : CsvTable) -> String

Render inferred schema for a table as compact text.

#
table_select_columns

fn table_select_columns(table : CsvTable, columns : Array[String]) -> CsvTable

Keep only the requested columns, in the order requested.

#
table_slice_rows

fn table_slice_rows(table : CsvTable, start : Int, end : Int) -> CsvTable

Return rows in the half-open range [start, end).

#
table_sort_by_column

fn table_sort_by_column(table : CsvTable, column : String) -> CsvTable

Sort rows lexicographically by a column, with missing cells treated as empty strings.

#
table_to_html

fn table_to_html(table : CsvTable) -> String

Export a table as a compact HTML table.

#
table_to_json_lines

fn table_to_json_lines(table : CsvTable) -> String

Convert a header-aware table to JSON Lines with all values represented as strings.

#
table_to_markdown

fn table_to_markdown(table : CsvTable) -> String

Convert a header-aware table to a Markdown table.

#
table_to_rows

fn table_to_rows(table : CsvTable) -> Array[Array[String]]

Convert a table back into raw rows, with headers as the first row.

#
table_transpose

fn table_transpose(table : CsvTable) -> CsvTable

Transpose a table. The first output column contains original header names.

#
table_trim_all

fn table_trim_all(table : CsvTable) -> CsvTable

Trim ASCII whitespace around all headers and cells.

#
table_union_by_name

fn table_union_by_name(left : CsvTable, right : CsvTable) -> CsvTable

Union two tables by column name, adding missing cells as empty strings.

#
table_uppercase_column

fn table_uppercase_column(table : CsvTable, column : String) -> CsvTable

Convert values in one column to uppercase.

#
table_with_row_numbers

fn table_with_row_numbers(table : CsvTable, column : String) -> CsvTable

Add a row number column starting at 1.

#
tsv_dialect

fn tsv_dialect() -> CsvDialect

Tab-separated value dialect.

#
validate_allowed_values

fn validate_allowed_values(table : CsvTable, column : String, allowed : Array[String], required : Bool) -> Array[CsvValidationError]

Validate that values are in an allowed set. Empty values are allowed when required is false.

#
validate_inferred_schema

fn validate_inferred_schema(table : CsvTable) -> Array[CsvValidationError]

Validate a table against its inferred schema.

#
validate_max_number

fn validate_max_number(table : CsvTable, column : String, maximum : Double) -> Array[CsvValidationError]

Validate that all non-empty numeric values are at most maximum.

#
validate_min_number

fn validate_min_number(table : CsvTable, column : String, minimum : Double) -> Array[CsvValidationError]

Validate that all non-empty numeric values are at least minimum.

#
validate_required_columns

fn validate_required_columns(table : CsvTable, columns : Array[String]) -> Array[CsvValidationError]

Validate that all required columns exist in the table header.

#
validate_row_widths

fn validate_row_widths(table : CsvTable) -> Array[CsvValidationError]

Validate that each row has exactly the same number of cells as the header.

#
validate_table

fn validate_table(table : CsvTable, rules : Array[CsvColumnRule]) -> Array[CsvValidationError]

Validate a table against required columns and simple scalar types.

#
validate_unique_key

fn validate_unique_key(table : CsvTable, columns : Array[String]) -> Array[CsvDuplicateKeyError]

Validate uniqueness for one or more key columns.

#
validation_errors_concat

fn validation_errors_concat(first : Array[CsvValidationError], second : Array[CsvValidationError]) -> Array[CsvValidationError]

Merge multiple validation error arrays into one array.

#
validation_errors_to_markdown

fn validation_errors_to_markdown(errors : Array[CsvValidationError]) -> String

Export validation errors as a Markdown list.

#
validation_errors_to_text

fn validation_errors_to_text(errors : Array[CsvValidationError]) -> String

Render validation errors as a compact human-readable report.