[26.0.0] - 2026-10-19 🧭 The "New Angles" Release 📐
~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,jsonlandreadstatnow followQSV_DEFAULT_DELIMITERon 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.schemacan generate stricter schemas (#4830). A column that holds a single value in the input now always gets aconstconstraint, which most files with a low-cardinality column used to lose, sovalidaterejects later data with any other value there (e.g. a changed phone number or URL). Generate schemas from a representative dataset, and loosen or removeconst/enumconstraints where values are expected to change.
🙏 Contributors
Thanks to everyone who made 26.0.0 possible:
- @dajiaohuang for making
schemainfer Unicode character lengths instead of UTF-8 byte lengths (#4827) - @ybai08 for fixing
geoconvertGeoJSON 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
