CSVs sliced, diced & analyzed.
This a quick release adding several frequency
enhancements for more detailed frequency analysis. The frequency
command now includes a percentage column, calculates other
values, and supports limiting unique counts and negative limits.
These options provides additional context for Datapusher+, qsv-pro and describegpt
so their metadata inferences are more accurate and comprehensive.
Previously, for a 775-row CSV file containing one column named state
with entries for all 50 states, frequency
only showed[^1]:
qsv frequency freq_state_example.csv | qsv table
field value count
state NY 100
state NJ 70
state CA 60
state MA 55
state FL 45
state TX 43
state NM 40
state AZ 39
state NV 38
state MI 35
Now, there's a new percentage
column and other
values calculation, both of which have configurable options:
qsv frequency freq_state_example.csv | qsv table
field value count percentage
state NY 100 12.90323
state NJ 70 9.03226
state CA 60 7.74194
state MA 55 7.09677
state FL 45 5.80645
state TX 43 5.54839
state NM 40 5.16129
state AZ 39 5.03226
state NV 38 4.90323
state MI 35 4.51613
state Other (40) 250 32.25806
This release is also out of cycle to address a big performance regression in the excel
command caused by unnecessary formula info retrieval for the --error-format
option introduced in 0.126.0. This has been fixed, and the excel
command is now back to its speedy self.
frequency
: added percentage column; other
values calculation, implementing https://github.com/jqnatividad/qsv/issues/1774 https://github.com/jqnatividad/qsv/pull/1775
benchmarks
: added new frequency
and excel
benchmarks https://github.com/jqnatividad/qsv/commit/b83ad3aae1cdf9a1750201cbf9b3ccd4ac3a4192
excel
: fixed performance regression because qsv was unnecessarily getting formula info (an expensive operation) for --error-format
option even when not required https://github.com/jqnatividad/qsv/commit/772af3420c44c864e06cd2cb61606900bff17947
sqlp
is 2.87 times faster than duckdb v0.10.2 for a simple aggregation (0.066 secs vs 0.19 secs), and 1.42 times faster for an "expensive" aggregation (0.143 secs vs 0.203 secs).Full Changelog: https://github.com/jqnatividad/qsv/compare/0.126.0...0.127.0
[^1]: with its default --limit
setting of 10 only show the top 10 unique values in the column, sorted by occurence
describegpt
headlines this release, with its new ability to support other local Large Language Models (LLMs) using popular tools that serve them through APIs such as Ollama and Jan. This broadens the tool's utility in diverse AI environments. Beyond OpenAI, qsv can now use other popular LLMs like Llama 3, Mistral, and Gemma. It also unlocks expanded metadata inferencing capabilities in qsv pro.
Several commands got additional options: cat
with --no-headers
support in the rowskey
subcommand; excel
with new options like --error-format
and short --metadata
mode; and foreach
with a --dry-run
option. frequency
also got new options, including --unq-limit
for limiting unique counts, support for negative limits, and a --lmt-threshold
option for compiling comprehensive frequencies below a threshold. slice
now supports negative indices and new JSON output options, providing more flexibility in data slicing.
This is all rounded out with sqlp
improvements, including support for single-line comments in SQL scripts and a special SKIP_INPUT
value to skip input preprocessing when using table functions directly in Polars SQL (e.g. read_csv()
and read_parquet()
) - all while increasing performance thanks to the Polars engine being upgraded to 0.39.2.
cat
: Added --no-headers
support to the rowskey
subcommand.describegpt
: Added compatibility for other local Large Language Models (LLMs) such as Ollama and Jan, broadening the tool's utility in diverse AI environments.excel
: Introduced new options in the excel command: --error-format
for better error handling and a short --metadata
JSON mode.foreach
: added a --dry-run
option, allowing users to preview the results of scripts without executing them.frequency
: New options added such as --unq-limit
for limiting unique counts; support for negative limits to only show frequencies >= abs(negative limit); and a --lmt-threshold
option to allow the compilation of comprehensive frequencies below the threshold - all providing more detailed control over frequency analysis.slice
: Support for negative indices to slice from the end and new JSON output options.sqlp
: sqlp now supports single-line comments and includes a special SKIP_INPUT value for more efficient data loading. The Polars engine has also been upgraded to 0.39.2, providing enhanced performance and stability.datefmt
and validate
commands, and increased default length for --infer-len
in sqlp
for improved performance.sqlp
vs duckdb added to ensure there are no performance regressions between releases. Right now, sqlp
is faster than duckdb
in most cases (thanks to Polars - see the latest TPC-H benchmarks), but we want to make sure that we keep it that way.cat
: add --no-headers
support to rowskey subcommand https://github.com/jqnatividad/qsv/pull/1762
describegpt
: add compatibility for other (local) LLMs (Ollama, Jan, etc.) by @rzmk in https://github.com/jqnatividad/qsv/pull/1761
excel
: add --error-format
option https://github.com/jqnatividad/qsv/pull/1721
excel
: add --metadata
short JSON mode https://github.com/jqnatividad/qsv/pull/1738
foreach
: add --dry-run
option https://github.com/jqnatividad/qsv/pull/1740
frequency
: add --unq-limit
option https://github.com/jqnatividad/qsv/pull/1763
frequency
: add support for negative --limit
s https://github.com/jqnatividad/qsv/pull/1765
frequency
: add --lmt-threshold
option https://github.com/jqnatividad/qsv/pull/1766
slice
: add support for negative --index
option values https://github.com/jqnatividad/qsv/pull/1726
slice
: implement --json
output option https://github.com/jqnatividad/qsv/pull/1729
sqlp
: added support for single-line comments in SQL scripts https://github.com/jqnatividad/qsv/commit/bb52bcee61d8ea980a2ab093315ead0c153517a5
sqlp
: added SKIP_INPUT special value to short-circuit input processing if the user wants to
load input files directly using table functions (e.g. read_csv(), read_parquet(), etc.) https://github.com/jqnatividad/qsv/commit/fe850adb47f1d7aa7f6c3981e350646e7b0c7476
validate
: add --valid-output
option https://github.com/jqnatividad/qsv/pull/1730
benchmarks
: added sqlp
vs duckdb
benchmarks.datefmt
: microoptimize formatting https://github.com/jqnatividad/qsv/commit/0ee27e768fdc08b7381094842d22b45940fd0a26
joinp
: adapt to breaking change in Polars 0.39 for lazyframe sort https://github.com/jqnatividad/qsv/commit/c625ca9f5aef59c736a837aaa4eeda7688403c37
sqlp
: change --infer-len
option default from 250 to 1000 for increased performance https://github.com/jqnatividad/qsv/commit/da1d215d803f8bfe400a7202feeecb8ae14239e9
validate
: microoptimize to_json_instance()
https://github.com/jqnatividad/qsv/commit/c2e4a1c696300eea04cccacca33f6872622ec086
count
: empty CSVs count as zero also for polars. Fixes #1741 https://github.com/jqnatividad/qsv/pull/1742
excel
: fix #1682 by adding --error-format
option https://github.com/jqnatividad/qsv/issues/1689
fetch
& fetchpost
: more robust JSON response validation https://github.com/jqnatividad/qsv/commit/ebc7287cd929cc23629ee53c7d82e0b8984bc2b0
slice
: use write!
macro to get rid of GH Advanced Security lint https://github.com/jqnatividad/qsv/commit/c739097e20d526cb6f49ca69d76fed8b28adc029
sqlp
: fixed docopt defaults that were not being parsed correctly https://github.com/jqnatividad/qsv/commit/fe850adb47f1d7aa7f6c3981e350646e7b0c7476
deps
: bump h2 from 0.4.3 to 0.4.4 to fix HTTP2 Continuation Flood vulnerability https://github.com/jqnatividad/qsv/commit/6af0da27f4e4a0bb6d5563701c07c89ad00f76b8
deps
: bump rustls from 0.22.3 to 0.22.4 to fix https://nvd.nist.gov/vuln/detail/CVE-2024-32650 https://github.com/jqnatividad/qsv/pull/1758
fetch
& fetch post
: remove jsonxf crate; use serde_json to prettify JSON strings https://github.com/jqnatividad/qsv/pull/1727
reverse
: remove kludgy expansion of read/write buffers https://github.com/jqnatividad/qsv/commit/46095cdf57f65c5380251c5d59317053ae1f80c3
Full Changelog: https://github.com/jqnatividad/qsv/compare/0.125.0...0.126.0
This was done primarily by tweaking several supporting qsv crates. qsv-docopt
now parses command-line arguments slightly faster. qsv-stats
, the crate behind commands like stats
, schema
, tojsonl
, and frequency
, has been further optimized for speed. qsv-dateparser
has been updated to support new timezone handling options in datefmt
. qsv-sniffer
also got a speed boost.
Per the benchmark suite, stats
is 25% faster (1.563 secs vs 2.067 secs) when computing the 13 "streaming" stats and 14% faster when computing --everything
(17 columns of addl stats - 3.149 secs vs 3.656 secs) for the 1M row, 41 column, 520mb sample of NYC's 311 data.
The count
command has been refactored to utilize Polars' SQLContext, which leverages LazyFrames evaluation to automagically count even very large files in just a few seconds. Previously, count
was already using Polars, but it mistakenly fell back to a slower counting mode. Now, it consistently delivers fast performance, even without an index. On the same benchmark suite, it takes 0.052 secs vs 0.503 seconds - almost 10x faster!
As count
is not just a top-level command, but also a widely used helper used by several qsv commands, this gives the entire suite a nice performance boost.
Continuing on the performance front, the excel
command now has a new short --metadata
mode, allowing users to just get a "shorter" version of the metadata report that only list the workbook's top level metadata (sheet index, sheet name, sheet type, visibility) instead of the full metadata report (which also has info like num rows, column metadata, etc.). On the benchmark suite, the short metadata report takes all of 0.005 secs vs 11.237 secs for the 1M row xlsx version of the same NYC 311 data - more than 3 orders of magnitude faster! (it may actually be faster since 0.005 secs is at the limits of what hyperfine can measure)
The datefmt
command also got some major enhancements with new timezone handling and timestamp parsing options, though at the cost of a small 15% performance penalty.
Lastly, we are excited to announce that qsv will be featured at the CSV,Conf,V8 conference in Puebla, Mexico on May 28-29. I'll be presenting a talk titled "qsv: A Blazing Fast CSV Data-Wrangling Toolkit". Hope to see you there!.
excel
: added short mode to --metadata
option https://github.com/jqnatividad/qsv/pull/1699
datefmt
: added ts-resolution
option to specify resolution to use when parsing unix timestamps https://github.com/jqnatividad/qsv/pull/1704
datefmt
: added timezone handling options https://github.com/jqnatividad/qsv/pull/1706 https://github.com/jqnatividad/qsv/pull/1707 https://github.com/jqnatividad/qsv/pull/1642
count
: refactored to use Polars SQLContext https://github.com/jqnatividad/qsv/commit/43a236f6a45c890d2bb6b4c43eb469bd627f82e1
stats
: refactored stats_path helper function https://github.com/jqnatividad/qsv/commit/174c30e3b87470613ff34a98617d44e477a4296a
apply
, applydp
, datefmt
, excel
, geocode
, py
, validate
: use std::mem::take to avoid clone https://github.com/jqnatividad/qsv/commit/1fd187f23262b51e0f431664895d49fd930d011a https://github.com/jqnatividad/qsv/commit/8402d3a8063ef161fc9ec68dd7f0f0601802d21d https://github.com/jqnatividad/qsv/commit/849615775505a25888a50b255ba0d544e878aeaf
excel
: optimized workbook opening operation https://github.com/jqnatividad/qsv/commit/67f662eba501e543ec44e5daf5eb175f8a8ae7b1
#[cfg(debug_assertions)]
conditional compilation to avoid compiling debug code in release modejsonschema
, cached
, self_update
and localzone
crates to avoid old dependencies
which was causing dependency bloatcount
: fixed polars_count_input helper, as it was always falling back to "slow" counting mode https://github.com/jqnatividad/qsv/commit/3484c89080d41d2e39457c918a893189aee64753
Full Changelog: https://github.com/jqnatividad/qsv/compare/0.124.1...0.125.0
This release is all about speed, speed, speed! We've made qsv even faster by leveraging Polars' multithreaded, mem-mapped CSV reader to get near-instant row counts of large CSV files, and near instant SQL queries and aggregations with Datapusher+ - automagically inferring metadata and giving you quick insights into your data in seconds!
We're demoing our qsv-powered Datapusher+ at the March 2024 installment of CKAN Montly Live on March 20, 2024, 13:00-14:00 UTC. Join us!
Beyond pushing data reliably at speed into your CKAN Datastore (it pushes real good! 😉), DP+ does some extended analysis, processing and enrichment of the data so it can be readily Used.
Both fetch
and fetchpost
commands now also have a --disk-cache
option and are fully synched - forming the foundation for high-speed data enrichment from Web Services - including datHere's forthcoming, fully-integrated Data Enrichment Service.
count
: automatically use Polars multithreaded, mem-mapped CSV reader when polars
feature is enabled to get near-instant row counts of large CSV files even without an index https://github.com/jqnatividad/qsv/pull/1656
qsvdp
: added polars support to Datapusher+-optimized binary variant, so we can do near instant SQL queries and aggregations during DP+ processing https://github.com/jqnatividad/qsv/pull/1664
fetchpost
: added --disk-cache
options and synced usage options with fetch
https://github.com/jqnatividad/qsv/pull/1671
.infile-list
to skip empty and commented lines, and to validate file paths
https://github.com/jqnatividad/qsv/commit/20a45c80fa32ef8a8060bb32cc94b7934da23229 and
https://github.com/jqnatividad/qsv/commit/26509303719ce29e900cb73b5000671a78db6b4a
sqlp
: automatically disable read_csv()
fast path optimization when a custom delimiter is specified https://github.com/jqnatividad/qsv/pull/1648
dedup
: fixed #1665 dedup not handling numeric values properly by adding a --numeric option https://github.com/jqnatividad/qsv/pull/1666
joinp
: reenable join validation tests now that Polars 0.38.2 join validation is working again https://github.com/jqnatividad/qsv/commit/5faf90ed830541a724768e808c7f07f0a418e2ab and https://github.com/jqnatividad/qsv/commit/fcfc75b855c615effb50f23c09a1d66ce70505e8
count
: broken in unreleased 0.124.0. Polars-powered count require a "clean" CSV file as it infers the schema based on the first 1000 rows of a CSV. This will sometimes result in an invalid "error" (e.g. it infers a column is a number column, when its not). 0.124.1 fixes this by adding a fallback to the "regular" CSV reader if a Polars error occurs https://github.com/jqnatividad/qsv/commit/a2c086900d1c1f1ba8ed2b2d1eaf8e547e3ef740
gender_guesser
0.2.0 has been released. Remove patch.crates-io entry
https://github.com/jqnatividad/qsv/commit/97873a5c496bfd559d7a7804db4d28b94915d536
Full Changelog: https://github.com/jqnatividad/qsv/compare/0.123.0...0.124.1
In celebration of Open Data Day, we're releasing qsv 0.123.0 - the biggest release ever with 330+ commits! qsv 0.123.0 continues to focus on performance, stability and reliability as we continue setting the stage for qsv's big brother - qsv pro.
We've been baking qsv pro for a while now, and it's almost ready for release. qsv pro is a cross-platform Desktop Data Wrangling tool marrying an Excel-like UI with the power of qsv, backed by cloud-based data cleaning, enrichment and enhancement service that's easy to use for casual Excel users and Data Publishers, yet powerful enough for data scientists and data engineers.
Stay tuned!
sqlp
now has automatic read_csv()
fast path optimization, often making optimized queries run dramatically faster - e.g what took 6.09 seconds for a non-trivial SQL aggregation on an 18 column, 657mb CSV with 7.43 million rows now takes just 0.14 seconds with the optimization - 🚀 43.5x FASTER 🚀 ! [^1]
[^1]: measurements taken on an Apple Mac Mini 2023 model with an M2 Pro chip with 12 CPU cores & 32GB of RAM, running macOS Sonoma 14.4# with fast path optimization turned off
/usr/bin/time qsv sqlp taxi.csv --no-optimizations "select VendorID,sum(total_amount) from taxi group by VendorID order by VendorID"
VendorID,total_amount
1,52377417.52985942
2,89959869.13054822
4,600584.610000027
(3, 2)
6.09 real 6.82 user 0.16 sys
# with fast path optimization, fully exploiting Polars' multithreaded, mem-mapped CSV reader!
/usr/bin/time qsv sqlp taxi.csv "select VendorID,sum(total_amount) from taxi group by VendorID order by VendorID"
VendorID,total_amount
1,52377417.52985942
2,89959869.13054822
4,600584.610000027
(3, 2)
0.14 real 1.09 user 0.09 sys
# in contrast, csvq takes 72.46 seconds - 517.57x slower
/usr/bin/time csvq "select VendorID,sum(total_amount) from taxi group by VendorID order by VendorID"
+----------+---------------------+
| VendorID | SUM(total_amount) |
+----------+---------------------+
| 1 | 52377417.529256366 |
| 2 | 89959869.1264675 |
| 4 | 600584.6099999828 |
+----------+---------------------+
72.46 real 65.15 user 75.17 sys
qsv and csvq both operate on "bare" CSVs. For comparison, let's contrast qsv's performance against "traditional" SQL engines that require setup and import (aka ETL). Not counting setup and import time (which alone, takes several minutes), we get:
sqlite> .timer on
sqlite> select VendorID,sum(total_amount) from taxi group by VendorID order by VendorID;
1,52377417.53
2,89959869.13
4,600584.61
Run Time: real 2.910 user 2.569494 sys 0.272972
sqlp
now supports JSONL output format and adds compression support for Avro and Arrow output formats.fetch
now has a --disk-cache
option, so you can cache web service responses to disk, complete with cache control and expiry handling!jsonl
is now multithreaded with additional --batch
and --job
options.split
now has three modes: split by record count, split by number of chunks and split by file size.datefmt
is a new top-level command for date formatting. We extracted it from apply
to make it easier to use, and to set the stage for expanded date and timezone handling.enum
now has a --start
option.excel
now has a --keep-zero-time
option and now has improved datetime/duration parsing/handling with upgrade of calamine from 0.23 to 0.24.tojsonl
now has --trim
and --no-boolean
options and eliminated false positive boolean inferences.apply
: add gender_guess
operation https://github.com/jqnatividad/qsv/pull/1569
datefmt
: new top-level command for date formatting. https://github.com/jqnatividad/qsv/pull/1638
enum
: add --start
option https://github.com/jqnatividad/qsv/pull/1631
excel
: added --keep-zero-time
option; improved datetime/duration parsing/handling with upgrade of calamine from 0.23 to 0.24 https://github.com/jqnatividad/qsv/pull/1595
fetch
: add --disk-cache
option https://github.com/jqnatividad/qsv/pull/1621
jsonl
: major performance refactor! Now multithreaded with addl --batch
and --job
options https://github.com/jqnatividad/qsv/pull/1553
sniff
: added addl mimetype/file formats detected by bumping file-format
from 0.23 to 0.24 https://github.com/jqnatividad/qsv/pull/1589
split
: add <outdir>
error handling and add usage text examples https://github.com/jqnatividad/qsv/pull/1585
split
: added --chunks
option https://github.com/jqnatividad/qsv/pull/1587
split
: add --kb-size
option https://github.com/jqnatividad/qsv/pull/1613
sqlp
: added JSONL output format and compression support for AVRO and Arrow output formats in https://github.com/jqnatividad/qsv/pull/1635
tojsonl
: add --trim
option https://github.com/jqnatividad/qsv/pull/1554
luau
: bumped Luau from 0.606 to 0.614freq
: major performance refactor - https://github.com/jqnatividad/qsv/commit/1a3a4b4f54f7459ce120c2bc907385ad72d34d8e
split
: migrate to rayon from threadpool https://github.com/jqnatividad/qsv/pull/1555
split
: refactored to actually create chunks <= desired --kb-size
, obviating need for hacky --sep-factor
option https://github.com/jqnatividad/qsv/pull/1615
tojsonl
: improved true/false boolean inferencing false positive handling https://github.com/jqnatividad/qsv/pull/1641
tojsonl
: fine-tune boolean inferencing https://github.com/jqnatividad/qsv/pull/1643
schema
: use parallel sort when sorting enums for fields https://github.com/jqnatividad/qsv/commit/523c60a36bf45b4df5e66f3951a91948c22d5261
simple_home_dir
with simple_expand_tilde
crate https://github.com/jqnatividad/qsv/pull/1578
stats
: fixed cache.json file not being updated properly https://github.com/jqnatividad/qsv/commit/b9c43713b0943baf2d70eb7089e1d8f05b848b9d
datefmt
subcommand from apply
https://github.com/jqnatividad/qsv/pull/1638
Full Changelog: https://github.com/jqnatividad/qsv/compare/0.122.0...0.123.0
Please help define the future of qsv. Add what you're currently using qsv for here - https://github.com/jqnatividad/qsv/discussions/1529
Not only does it help us catalog what use cases we should optimize for, posters will get higher priority access to the qsv pro preview.
qsvpy
is now available in the prebuilt binaries for select platforms! It's a new qsv binary variant with the python feature, enabling the py
command. Three subvariants are available - qsvpy310, qsvpy311 and qsvpy312, corresponding to Python 3.10, 3.11 and 3.12 respectively.generate
command as generate
's main dependency is unmaintained and has old dependencies. generate
was also not used much, as the test data it generated was not well suited for training models and it was too slow so we decided to remove it even before the synthesize
(#235) command is ready.reverse
now has index support and can work in "streaming" mode and handle larger than memory CSV files.sort
and sample
: users can now choose from three Random Number Generator (RNG) algorithms with the --rng
option - standard, faster & cryptosecure.pseudo
now has --start
, --increment
& --formatstr
options.fmt
now has a --no-final-newline
option to suppress the final newline for better interoperability with other tools, specifically Excel. It also treats "T" as special value for tab character for the --out-delimiter
option.reverse
: now has index support and can work in "streaming" mode https://github.com/jqnatividad/qsv/pull/1531
sort
: added --rng <kind>
for different kinds of RNGs - standard, faster & cryptosecure https://github.com/jqnatividad/qsv/pull/1535
sample
: added --rng <kind>
option (standard, faster & cryptosecure) https://github.com/jqnatividad/qsv/pull/1532
pseudo
: major refactor. Added --start
, --increment
& --formatstr
options https://github.com/jqnatividad/qsv/pull/1541
fmt
: add --no-final-newline
option https://github.com/jqnatividad/qsv/pull/1545
fmt
: --out-delimiter
now treats "T" as special value for tab character https://github.com/jqnatividad/qsv/pull/1546
generate
command https://github.com/jqnatividad/qsv/pull/1527
generate
feature from GitHub Action workflows https://github.com/jqnatividad/qsv/pull/1528
sample
: removed --faster
RNG sampling option, replacing it with --rng
https://github.com/jqnatividad/qsv/pull/1532
Full Changelog: https://github.com/jqnatividad/qsv/compare/0.121.0...0.122.0
Two days ago, qsv 0.120.0 was released. Hours later, significant updates occurred in our ecosystem: Polars upgraded to version 0.36, Homebrew rolled out support for Rust 1.75.0, and our pull request for 'cached' was merged.
In light of these developments, we're releasing 0.121.0 out of cycle to leverage the new features, fixes and performance enhancements in these key components integral to qsv.
👉 REQUEST FOR USE CASES: 👈 Please help define the future of qsv. Add what you're currently using qsv for here - https://github.com/jqnatividad/qsv/discussions/1529
Not only does it help us catalog what use cases we should optimize for, posters will get higher priority access to the qsv pro preview.
sqlp
: with Polars 0.36, it now supports:
sqlp
: now supports writing to Apache Avro format https://github.com/jqnatividad/qsv/commit/32f2fbb1b06dfbee4e7823521e9991a306e7eb44
sqlp
: when writing to CSV --format
, if the --output
file has a TSV or TAB extension, it will automatically use the tab delimiter https://github.com/jqnatividad/qsv/commit/c97048cfc8c0fed01d7b32d3173be508135b9769
cat
: fixed performance regression in rowskey
by moving unchanging variables out of hot loop - https://github.com/jqnatividad/qsv/commit/96a40e93b5ab09655aa90f8653014c96d3da652b
sqlp
: Polars 0.36 fixed the SQL SUBSTR() functionFull Changelog: https://github.com/jqnatividad/qsv/compare/0.120.0...0.121.0
Happy New Year! 🎉🎉🎉 Here's the first release of 2024, the biggest ever with 280+ commits! qsv 0.120.0 continues to focus on performance, stability and reliability as we continue setting the stage for qsv's big brother - qsv pro.
Apart from wrapping qsv with a User Interface, qsv pro also comes with a retinue of related cloud-based data cleaning, enrichment and enhancement services along with expanded metadata inferencing to make your Data Useful, Usable and Used!
qsv pro draws inspiration from OpenRefine, but reimagined without its file size and speed limitations, with qsv pro having the ability to process multi-gigabyte files in seconds.
It incorporates hard lessons we learned in the past 12 years deploying Data Portals and Data Pipelines to create a new Data/Metadata Wrangling and AI-assisted Data Publishing service that's easy to use for casual Excel users and Data Publishers, yet powerful enough for data scientists and data engineers.
But it's not quite ready for release yet, so stay tuned!
We're now taking signups for a preview release however, so if you're interested, please sign up here!
Excitingly, qsv was also mentioned on Hacker News in this thread Dec 23, 2023! As a result, we're now almost at 2,000+ stars on GitHub from 900 stars on Dec 22! 🎉🎉🎉
Stay tuned for more advancements in 2024 – it's set to be a landmark year for qsv! 🦄🦄🦄
cat
: add rowskey --group options; increased perf of rowskey https://github.com/jqnatividad/qsv/pull/1508
validate
: add --trim and --quiet options https://github.com/jqnatividad/qsv/pull/1452
apply
& applydp
: operations regex_replace
now supports empty --replacement
with the "<NULL>" special value https://github.com/jqnatividad/qsv/pull/1470 and https://github.com/jqnatividad/qsv/pull/1471
exclude
: also consider rows with empty fields https://github.com/jqnatividad/qsv/pull/1498
extsort
: add --tmp-dir
option https://github.com/jqnatividad/qsv/commit/ca1f46145cf6a06ad4401e2bf30f82415cc2ef82
validate
: Faster RFC4180 validation with byterecords and SIMD-accelerated utf8 validation https://github.com/jqnatividad/qsv/pull/1440
excel
: minor performance tweaks https://github.com/jqnatividad/qsv/pull/1446
apply
, applydp
, explode
, geocode
, pseudo
: consolidate redundant code and use one replace_column_value
helper fn in util.rs https://github.com/jqnatividad/qsv/pull/1456
excel
: bump calamine from 0.22 to 0.23 https://github.com/jqnatividad/qsv/pull/1473
excel
& joinp
: use atoi_simd for faster &[u8] to int conversion https://github.com/jqnatividad/qsv/commit/9521f3e3fb73f600e6691188a65e19eda6cd317e
cat
, describegpt
, headers
, sqlp
, to
, tojsonl
: refactor commands that accept multiple input files to use improved process_input helper https://github.com/jqnatividad/qsv/pull/1496
fetch
& fetchpost
: get_response refactor for maintainability and performance https://github.com/jqnatividad/qsv/pull/1507
luau
: replaced --no-colindex option with --colindex option. --col-index slows down processing and is not often used, so make it an option, not the default. https://github.com/jqnatividad/qsv/commit/a0c856807c47f00f531837ae124d412fca834cd2
apply
: Fix for dynfmt
and calcconv
subcommands not working in release mode https://github.com/jqnatividad/qsv/pull/1467
luau
: fix check for excess mapped columns earlier. Otherwise, we'll get a CSV different field count error https://github.com/jqnatividad/qsv/commit/db1581159590205af9befaade5c047d316c9c8b3
luau
: remove unneeded --jit
option as we precompile luau scripts to bytecode https://github.com/jqnatividad/qsv/pull/1438
Full Changelog: https://github.com/jqnatividad/qsv/compare/0.119.0...0.120.0
As we prepare for version 1.0, we're focusing on performance, stability and reliability as we set the stage for qsv pro - a cloud-backed UI version of qsv powered by Tauri, set to be released in 2024. Stay tuned!
diff
is now out of beta and blazingly fast! Give "the fastest CSV-diff in the world" a try :wink:!joinp
now supports snappy automatic compression/decompression!sqlp
& joinp
now recognize the QSV_COMMENT_CHAR
environment variable, allowing you to skip comment lines in your input CSV files. They're also faster with the upgrade to Polars 0.35.4.sqlp
now supports subqueries, table aliases, and more!luau
: upgraded embedded Luau from 0.599 to 0.604; refactored code to reduce unneeded allocations and increase performance (more than doubling it!) as we prepare for extended recipe support.cat
is now even faster with the --flexible
option. If you know your CSV files are valid, you can use this option to skip CSV validation and make cat
run twice as fast!QSV_OUTPUT_BOM
environment variable.stats
, sort
, schema
& validate
are now faster with the use of atoi_simd
to directly convert &[u8] to integer, skipping unnecessary utf8 validation, while also using SIMD CPU instructions for noticeably faster performance.diff
: added option/flag for headers in output by @janriemer in https://github.com/jqnatividad/qsv/pull/1395
diff
: added option/flag --delimiter-output
by @janriemer in https://github.com/jqnatividad/qsv/pull/1402
cat
: added --flexible
option to make cat rows
faster still https://github.com/jqnatividad/qsv/pull/1408
sqlp
& joinp
: both commands now recognize QSV_COMMENT_CHAR env var https://github.com/jqnatividad/qsv/pull/1412
joinp
: added snappy compression/decompression support https://github.com/jqnatividad/qsv/pull/1413
geocode
: now automatically decompresses snappy-compressed index files https://github.com/jqnatividad/qsv/pull/1429
stats
, sort
, schema
& validate
: use atoi_simd to directly convert &[u8] to integer skipping unnecessary utf8 validation, while also using SIMD instructions for noticeably faster performancecat
: faster cat rows
https://github.com/jqnatividad/qsv/pull/1407
count
: optimize --width
option https://github.com/jqnatividad/qsv/pull/1411
luau
: upgrade embedded Luau from 0.603 to 0.604 https://github.com/jqnatividad/qsv/pull/1426
ato_simd
for fast &[u8] to int conversion https://github.com/jqnatividad/qsv/pull/1423
luau
: performance refactor https://github.com/jqnatividad/qsv/commit/4cebd7c9a4b3f9f754fd2746484c24fa61ee1286
pseudo
: detect when more than one column is selected for pseudonymization https://github.com/jqnatividad/qsv/commit/0b093726bb964c2a4a6eec15c0e30ed3660fdf97
Full Changelog: https://github.com/jqnatividad/qsv/compare/0.118.0...0.119.0
To verify prebuilt binary zip archives - click here.
sqlp
and joinp
enjoy expanded capabilities and a noticeable performance boost. 🦄🏇geocode
command, with users able to easily switch indices with the index-load
subcommand. As the name implies, the 500 index contains cities with populations of 500 or more, the 1000 index contains cities with populations of 1000 or more, and so on.geocode
command now returns US Census FIPS codes for US places with the %json
and %pretty-json
formats, returning both US State and US County FIPS codes, with upcoming support for Cities and other US Census geographies (School Districts, Voting Districts, Congressional Districts, etc.) 🎠stats
, schema
and tojsonl
commands with the stats cache bincode refactor. This is especially noticeable for large CSV files as stats
previously created large bincode cache files by default.schema
and tojsonl
) to skip recomputing statistics and deserialize the saved stats data structures directly into memory. Now, it will only create a bincode file if the --stats-binout
option is specified (typically, before using the schema
an tojsonl
commands). stats
will still continue to create a stats CSV cache file by default, but it will be much smaller than the bincode file, and is universally applicable, unlike the bincode cache. 🏇zipsign
command line tool. See Verifying the Integrity of the Prebuilt Binaries Zip Archive for more info. 🦄frequency
command now supports the --ignore-case
option for case-insensitive frequency counts. 🦄🎠schema
command can now compile case-insensitive enum constraints. 🦄apply
and applydp
commands with faster compile-time perfect hash functions for operations lookups. 🏇snappy
, sniff
& cat
commands. 🏇frequency
: added --ignore-case
option https://github.com/jqnatividad/qsv/pull/1386
geocode
: added 500, 1000, 5000, 15000 Geonames cities convenience shortcuts to index
subcommands https://github.com/jqnatividad/qsv/commit/bd9f4c34b0a88cc6a446872ed4cda41e8a1ca102
schema
: added --ignore-case
option when compiling enum constraints; replaced Hashset with faster AHashset https://github.com/jqnatividad/qsv/commit/a16a1ca25f93699a5ee27327f4257e8e559bc5e8
snappy
: added buf_size
parm to compress helper fn https://github.com/jqnatividad/qsv/commit/e0c0d1f7eb22917d43f638121babe23e366c9dd8
sniff
added --just-mime
option https://github.com/jqnatividad/qsv/pull/1372
apply
& applydp
: replaced binary_search with faster compile-time perfect hash functions for operations lookups https://github.com/jqnatividad/qsv/pull/1371
stats
, schema
and tojsonl
: stats cache bincode refactor https://github.com/jqnatividad/qsv/pull/1377
luau
: replaced sanitise-file-name with more popular sanitize-filename crate https://github.com/jqnatividad/qsv/commit/8927cb70bc92e9e1360547e96d1ac10e6037e9e3
cat
: minor optimization by preallocating with capacity https://github.com/jqnatividad/qsv/commit/c13c34120c47bb7ab603a97a0a7cae7f0de7b146
sqlp
& joinp
: expanded speed/functionality with upgrade to Polars 0.34.2 https://github.com/jqnatividad/qsv/pull/1385
tojsonl
: improved boolean inferencing. Now correctly infers booleans, even if the enum domain range is more than 2, but has cardinality 2 case-insensitive https://github.com/jqnatividad/qsv/commit/6345f2dc01f6451075ba7f23c35d8ba8cced9293
dedup
: fixed --ignore-case not being honored during internal sort option https://github.com/jqnatividad/qsv/pull/1387
applydp
: fixed wrong usage text using apply
and not applydp
https://github.com/jqnatividad/qsv/commit/c47ba86f305508a41e19ce39f2bd6323a0a60e1e
geocode
: fixed index-update
not honoring --timeout
parameter https://github.com/jqnatividad/qsv/commit/3272a9e3ac75e8b8f2d9f13b0cec81a0c41c7ed4
geocode
: fixed index-load
to work properly with convenience shortcuts https://github.com/jqnatividad/qsv/commit/5097326ee41d39787b472b4eea95ddec76bb06b5
Full Changelog: https://github.com/jqnatividad/qsv/compare/0.117.0...0.118.0