github dathere/qsv 26.0.0

pre-release3 hours ago

[26.0.0] - 2026-10-19 🧭 The "New Angles" Release 📐

qsv-26 0 0-new-angles

~57 commits since 25.0.0, and the theme is NEW ANGLES: four new ways to look at your data in viz, three of them off the usual x/y grid. Some data doesn't fit a scatter plot. Wind directions, hours of the day and months go around a circle, soil textures and vote shares are parts of a whole, and a table with six correlated measures has more dimensions than two axes can show.

POLAR. viz barpolar draws a wind rose: one bar per direction, clockwise from north, with compass labels (N, NE, NNE...) at their true bearings and --degrees for a numeric bearing column. The viz smart seasonality panel now uses polar bars too, so hour of day, day of week and month read like a clock face, starting at the top and running clockwise.

TERNARY. viz ternary plots three parts of a whole, such as sand, silt and clay, or three candidates' vote shares, with each row placed at its shares of the total.

PARALLEL COORDINATES. viz parcoords draws one line per row across several numeric columns; drag along an axis to filter. viz smart adds a parallel-coordinates panel to the Data Schematic when three or more measures correlate.

FUNNEL AREA. viz funnel --area sizes each stage by its share of the total.

SQL, from new angles too. Polars is bumped to upstream b951cd7, and sqlp gains moving-window frames (ROWS BETWEEN 2 PRECEDING AND CURRENT ROW), REGEXP_REPLACE, DATE_TRUNC, BIT_COUNT, and a read_ndjson() table function with named options.

Saying what you mean. --delimiter and QSV_DEFAULT_DELIMITER now follow the documented precedence in seven commands, schema output validates the CSV it was inferred from (--ignore-case, --enum-threshold and non-ASCII string lengths), count --width is fixed for quoted fields, and geoconvert handles GeoJSON features with different properties.

Same data, new angles.


Breaking Changes

This is 26.0.0 rather than 25.1.0 because two changes can alter existing output:

  • excel, jsonl and readstat now follow QSV_DEFAULT_DELIMITER on output (#4819), as other qsv writers already do. If you set it only to read semicolon files, these three now write semicolons to stdout as well. Unset it for those commands, or pass --delimiter ,, to keep commas.
  • schema can generate stricter schemas (#4830). A column that holds a single value in the input now always gets a const constraint, which most files with a low-cardinality column used to lose, so validate rejects later data with any other value there (e.g. a changed phone number or URL). Generate schemas from a representative dataset, and loosen or remove const/enum constraints where values are expected to change.

🙏 Contributors

Thanks to everyone who made 26.0.0 possible:

  • @dajiaohuang for making schema infer Unicode character lengths instead of UTF-8 byte lengths (#4827)
  • @ybai08 for fixing geoconvert GeoJSON to CSV when features have different properties (#4837)

Detailed Changelog: https://github.com/dathere/qsv/blob/master/CHANGELOG.md#v26-changes

Full Commit log: 25.0.0...26.0.0

Don't miss a new qsv release

NewReleases is sending notifications on new releases.