159个版本 (破坏性更新)

0.132.0 2024年8月21日
0.130.0 2024年7月29日
0.124.1 2024年3月16日
0.119.0 2023年11月20日
0.23.0 2021年11月29日

#37 in 解析实现

Download history 77/week @ 2024-05-03 65/week @ 2024-05-10 84/week @ 2024-05-17 325/week @ 2024-05-24 105/week @ 2024-05-31 96/week @ 2024-06-07 77/week @ 2024-06-14 68/week @ 2024-06-21 44/week @ 2024-06-28 79/week @ 2024-07-05 196/week @ 2024-07-12 71/week @ 2024-07-19 326/week @ 2024-07-26 90/week @ 2024-08-02 301/week @ 2024-08-09 144/week @ 2024-08-16

每月868次下载

MIT OR Unlicense

1.5MB
32K SLoC

qsv: 极快CSV数据处理工具包

Linux build status Windows build status macOS build status Security audit Codacy Badge Clones Discussions Crates.io Crates.io downloads Prebuilt Downloads Minimum supported Rust version FOSSA Status

  目录
qsv logo
嗨,"Quicksilver"出发!
标志细节
qsv是一个用于查询、切片、
索引、分析、过滤、丰富、转换、
排序、验证、连接和转换CSV文件的命令行程序。
命令简单、可组合且 "极快"

* 命令
* 安装选项
* 快速浏览 / 笔记本 / 课程与练习
* 食谱
* 常见问题解答
* 性能调整
* 👉 基准测试 🚀
* 环境变量
* 功能标志
* 目标/非目标
* 测试
* 纽约数据学校2022年/csv,conf,v8 幻灯片
* 赞助商

qsv.dathere.com 尝试一下!

命令 描述
apply
✨🚀🧠🤖🔣👆
将一系列字符串、日期、数学和货币转换应用到给定的CSV列。它还包含一些基本的自然语言处理功能(相似度情感分析粗俗eudex语言姓名性别检测)。
applydp
🚀🔣👆 CKAN
applydp是apply的精简版,只包含与Datapusher+相关的子命令/操作(仅提供qsvdp二进制变体)。
behead 从CSV中删除表头。
cat
🗄️
按行或按列连接CSV文件。
clipboard 从剪贴板提供输入或将输出保存到剪贴板。
count
📇🏎️🐻‍❄️
计算CSV文件中的行数。对于15GB、27m行的纽约市311数据集,如果没有索引,则耗时11.87秒。如果有索引,则瞬间完成。如果启用了polars功能,则使用Polars的多线程、内存映射CSV读取器,即使在没有索引的情况下也能快速计数。
datefmt
🚀👆
使用strftime日期格式说明符将识别的日期字段(识别19种格式)格式化为指定的日期格式。
dedup
🤯🚀👆
删除重复行(另请参阅extdedupextsortsortsortcheck命令)。
describegpt
🌐🤖🪄
使用OpenAI的API或符合OpenAI API规范的另一个API(如OllamaJan)的LLM从CSV中推断扩展元数据。
diff
🚀
以惊人的速度找到两个CSV之间的差异!
例如,在不到600ms的时间内比较两个1M行x 9列的CSV文件!
enum
👆
通过添加具有递增或UUID标识符的列来对行进行枚举,从而添加新列。也可以用于复制列或将新列填充为常数值。
excel
🚀
将指定的Excel/ODS工作表导出为CSV文件。
exclude
📇👆
根据指定的列从另一组CSV数据中删除一组数据。
explode
🔣👆
通过根据给定的分隔符拆分列值将行拆分为多个。
extdedup
使用内存映射、磁盘散列表从任意大小的CSV/文本文件中删除重复行。与dedup命令不同,此命令不会将整个文件加载到内存中,也不会对去重文件进行排序。
extsort
🚀
使用多线程外部归并排序算法对任意大小的CSV/文本文件进行排序。
fetch
✨🧠🌐
使用 HTTP Get 从网络服务获取每行的数据。带有 HTTP/2 自适应流量控制、支持 jql JSON 查询语言、动态节流 (RateLimit) 以及使用 Redis 或磁盘缓存的缓存。
fetchpost
✨🧠🌐
类似于 fetch,但使用 HTTP Post。(HTTP GET 与 POST 方法比较)
fill
👆
填充空值。
fixlengths 通过填充或截断强制 CSV 记录具有相同的长度。
flatten CSV 记录的平坦视图。适用于一次查看一个记录。
例如:qsv slice --i 5 data.csv | qsv flatten
fmt 使用不同的分隔符、记录终止符或引号规则重新格式化 CSV。 (支持 ASCII 分隔数据。)
frequency
📇😣🏎️👆🪄
构建每个列的 频率表。如果存在索引,则使用多线程以加快速度。
geocode
✨🧠🌐🚀🔣👆
根据可更新的本地副本的 Geonames 城市数据库对位置进行地理编码。具有缓存和多线程,地理编码高达 360,000 条记录/秒!
headers
🗄️
显示 CSV 的标题。或者显示多个 CSV 文件之间所有标题的交集。
index 为 CSV 创建索引(📇)。这非常快(即使是 15gb,28m 行的纽约市 311 数据集也只需 14 秒即可索引)并提供对 CSV 的常量时间索引/随机访问。使用索引,countsampleslice 的工作是瞬时的;在 luau 中启用了随机访问模式;并且为 frequencysplitstatsschematojsonl 命令启用了多线程(🏎️)。
input 读取具有特殊注释、引号、裁剪、行跳过和非 UTF8 编码处理规则的 CSV 数据。通常用于将 CSV “规范化”以供其他 qsv 命令进一步处理。
join
👆
内部、外部、右侧、交叉、反连接和半连接。自动创建一个简单的内存哈希索引以使其快速。
joinp
✨🚀🐻‍❄️
使用 Pola.rs 引擎执行内部、外部、右侧、交叉、反连接、半连接和 asof 连接。与 join 命令不同,joinp 可以处理比 RAM 大的文件,是多线程的,具有连接键验证、预连接过滤、支持 asof 连接(这对于时间序列数据特别有用)以及其输出列可以进行合并。然而,joinp 没有忽略大小写的选项。
json
👆
将 JSON 转换为 CSV。
jsonl
🚀🔣
将换行符分隔的 JSON (JSONL/NDJSON) 转换为 CSV。请参阅 tojsonl 命令以将 CSV 转换为 JSONL。

luau 👑
✨📇🌐🔣 CKAN
通过为CSV文件中的每一行执行Luau 0.635 表达式/脚本(顺序模式),或使用索引进行随机访问随机访问模式),来创建多个新的计算列,过滤行,计算聚合并构建复杂的数据管道。
可以处理单个Luau表达式或使用查找表进行完整的数据处理脚本,具有离散的BEGIN、MAIN和END部分。
它不仅仅是一个qsv命令,它是qsv的领域特定语言(DSL),具有许多qsv特定的辅助函数,用于构建生产数据管道。
partition
👆
基于列值对CSV进行分区。
prompt 打开文件对话框,可以选择文件作为输入或将输出保存到文件。
pseudo
🔣👆
匿名化给定列的值,通过用增量标识符替换它们来实现。
py
✨🔣
通过评估CSV文件每一行的Python表达式来创建新的计算列或过滤行。Python的f-strings特别适用于扩展格式化,还具有评估Python表达式的功能
rename 高效地重命名CSV的列。
replace
👆
使用正则表达式替换CSV数据。将正则表达式应用于每个字段。
reverse
📇🤯
反转CSV中行的顺序。与sort --reverse命令不同,它保留了具有相同键的行的顺序。如果存在索引,则使用常量内存。否则,它将所有数据加载到内存中。
safenames
CKAN
修改CSV的标题,只包含"安全"名称 - 保证"数据库就绪"/"CKAN就绪"的名称。
sample
📇🌐🏎️
使用蓄水池抽样从CSV中随机抽取行(可选种子),使用与样本大小成比例的内存。如果存在索引,则使用随机索引和常量内存。
schema
📇😣🏎️👆🪄
从CSV数据中推断模式,包括数据类型、域/范围验证,并以JSON Schema格式输出。如果存在索引,则使用多线程来加快速度。请参阅validate命令,以使用生成的JSON Schema验证是否类似的CSV符合该模式。
search
👆
在CSV上运行正则表达式。将正则表达式应用于所选字段并仅显示匹配的行。
searchset
👆
在单次遍历中运行多个正则表达式。将正则表达式应用于每个字段并仅显示匹配的行。
select
👆
选择、重新排序、反转、重复或删除列。
slice
📇🏎️
从CSV的任何部分切片行。如果存在索引,则只需解析切片中的行(而不是切片开始之前的所有行)。
snappy
🚀🌐
使用谷歌的 Snappy 框架格式(更多信息)对输入进行流压缩/解压缩。
sniff
🌐 CKAN
快速嗅探并推断CSV元数据(分隔符、标题行、前导行、引号字符、灵活、是否UTF-8、平均记录长度、记录数、内容长度以及如果从URL上嗅探CSV的估计记录数、字段数、字段名和数据类型)。它也是一个通用的MIME类型检测器。
sort
🚀🤯👆
按字母顺序(可选项不区分大小写)、数值、逆序、唯一或随机(可选项有种子)顺序对CSV数据进行排序(另见 extsort & sortcheck 命令)。
sortcheck
📇👆
检查CSV是否已排序。使用 --json 选项,还可以检索记录数、排序中断和重复数。
split
📇🏎️
将一个CSV文件拆分为多个CSV文件。它可以按行数、块数或文件大小进行拆分。如果按行或块拆分时存在索引,则使用多线程来加快速度。
sqlp
✨🚀🐻‍❄️🗄️
在多个CSV文件上运行 Polars SQL查询 - 将查询转换为快速的 LazyFrame 表达式,处理比内存大的CSV文件。
stats
📇🤯🏎️👆🪄
计算摘要统计(总和、最小/最大/范围、最小/最大长度、平均值、SEM、标准差、方差、CV、空值计数、最大精度、稀疏性、四分位数、IQR、下/上限界、偏度、中位数、众数/反众数 &基数)以及为CSV中的每一列做出保证的数据类型推断(Null、String、Float、Integer、Date、DateTime、Boolean)。
如果存在索引,使用多线程来加快速度(带有索引,可以在7.3秒内编译纽约市311数据(15gb,2800万行)的“流式”统计!)。
table
🤯
使用 弹性制表符 显示CSV的对齐输出。为了交互式查看CSV文件,qsv与csvlens配合良好。
to
✨🚀🗄️
将CSV文件转换为PostgreSQLSQLite、XLSX、Parquet数据包
tojsonl
📇😣🚀🔣🪄
智能地将CSV转换为换行分隔的JSON(JSONL/NDJSON)。通过首先扫描CSV,它“智能”推断每个列的适当JSON数据类型。请参阅 jsonl 命令以将JSONL转换为CSV。
transpose
🤯
转置CSV的行/列。
validate
📇🚀🌐
使用JSON Schema Validation闪电般快速验证CSV数据,并将无效记录放入一个单独的文件中,附带详细的验证错误报告文件(例如,使用纽约市311架构生成的NYC's 311 schema,由 schema 命令生成,每秒可达930,000行)。
如果没有提供JSON架构文件,则验证CSV是否符合RFC 4180标准并使用UTF-8编码。
在M2 Pro 12核Mac Mini(32gb RAM)上编译的性能指标

✨: 通过功能标志启用。
📇: 当可用时使用索引。
🤯: 将整个CSV加载到内存中,尽管dedupstatstranspose也有“流式”模式。
😣: 使用与CSV中列的基数成比例的额外内存。
🧠: 使用可用的会话间Redis/Disk缓存对昂贵的操作进行缓存。
🗄️: 扩展输入支持
🐻‍❄️: 由polars 0.42.0提供支持的命令。
🤖: 命令使用自然语言处理和通用人工智能技术。
🏎️: 当有索引(📇)时,多线程且/或更快。
🚀: 即使没有索引也支持多线程。
CKAN : 有CKAN感知的集成选项。
🌐: 有网络感知选项。
🔣: 需要UTF-8编码的输入。
👆: 有强大的列选择器支持。有关语法,请参阅select
🪄: 使用统计信息和/或频率来“更智能”和“更快”工作的“自动化”命令。

安装选项

选项0:TLDR快速安装

qsv pro已经可以从其网站下载,并且也计划在未来在Microsoft Store和Apple App Store中提供!在此期间,您可以使用以下包管理器单行命令快速安装qsv[^1]

[^1]:选项0实际上是选项2的快速启动版本。当然,必须首先安装包管理器。

# using Homebrew on macOS/Linux (https://formulae.brew.sh.cn/formula/qsv#default)
brew install qsv

# using Scoop on Windows (https://scoop.sh/#/apps?q=qsv)
scoop bucket add main
scoop install main/qsv

# using MacPorts on macOS (https://ports.macports.org/port/qsv/)
sudo port install qsv

## using other Linux package managers
# Arch Linux AUR (https://aur.archlinux.org/packages/qsv)
yay -S qsv

# Void Linux (https://voidlinux.org/packages/?arch=x86_64&q=qsv)
sudo xbps-install qsv

选项1:下载预构建的二进制文件

最新qsv版本的Linux、macOS和Windows的完整功能预构建二进制版本可供下载,包括使用Rust Nightly更多信息)编译的二进制文件。

这些预构建的二进制文件还启用了针对x86_64(例如,Intel和AMD处理器的SSE4.2AVX2AVX512等)和Apple Silicon处理器的CPU优化(ARM64 SIMD NEON)进行构建,以获得更多的性能提升。

对于Windows,还提供了用于下载的x86_64-pc-windows-msvc构建的MSI安装程序。

对于macOS,我们使用“ad-hoc”签名对二进制文件进行签名,因此您需要设置适当的Gatekeeper安全设置或运行以下命令,在首次运行前从qsv中移除隔离属性:

# replace qsv with qsvlite or qsvdp if you installed those binary variants
xattr -d com.apple.quarantine qsv

使用预构建二进制文件的一个额外好处是它们启用了self_update功能,允许您使用简单的qsv --update快速将qsv更新到最新版本。为了进一步提高安全性,self_update功能只从此GitHub存储库获取发布,并在安装更新之前自动验证下载的zip存档的签名。

注意:对于 unknown-linux-musl 预编译的二进制文件,我们使用 Ubuntu 20.04 LTS 和 musl libc 工具链通过 GitHub Action 运行器进行交叉编译。然而,Ubuntu 是基于 glibc 的,而不是基于 musl 的发行版。我们通过 交叉编译 来解决这个问题。
不幸的是,这阻止了我们使用启用 luau 功能的二进制文件进行交叉编译,因为这样做需要将宿主操作系统 libc 库静态链接。如果您需要在 musl 上使用 luau 功能,您需要在您自己的基于 musl 的 Linux 发行版(例如 Alpine、Void 等)上从源代码进行编译。

手动验证预编译二进制文件压缩包的完整性

所有预编译二进制文件压缩包都使用 zipsign 进行签名,以下为公钥 qsv-zipsign-public.key。要验证下载的压缩包的完整性

# if you don't have zipsign installed yet
cargo install zipsign

# verify the integrity of the downloaded prebuilt binary zip archive
# after downloading the zip archive and the qsv-zipsign-public.key file.
# replace <PREBUILT-BINARY-ARCHIVE.zip> with the name of the downloaded zip archive
# e.g. zipsign verify zip qsv-0.118.0-aarch64-apple-darwin.zip qsv-zipsign-public.key
zipsign verify zip <PREBUILT-BINARY-ARCHIVE.zip> qsv-zipsign-public.key

选项 2:软件包管理器和发行版

qsv 也由几个软件包管理器和发行版提供。请查看每个软件包管理器/发行版的文档以获取安装说明。

Packaging status

请注意,这些软件包管理器/发行版提供的 qsv 启用了不同的功能(例如,Homebrew 仅启用 applyluau 功能。但是,它将自动安装 bashfishzsh 终端的 shell 完成脚本)。

要了解包/发行版中的 qsv 启用了哪些功能,请运行 qsv --version (更多信息请参见 此处)。

在开源的真正精神下,这些软件包由希望使 qsv 在各种环境中更容易安装的志愿者维护。我们非常感谢他们,我们通过 GitHub 与软件包维护者松散合作,但请注意,这些软件包由第三方维护。

dat目前正在开发一个发布工作流程,用于在发布时创建 Ubuntu 软件包。这个软件包将针对最新的 Ubuntu LTS x86_64 架构。

选项 3:使用 Rust 安装

如果您已安装 Rust,您也可以使用 Rust 的 cargo 命令从源代码进行安装[^2]

[^2]: 当然,您还需要链接器和 C 编译器。Linux 用户应根据其发行版的文档安装 GCC 或 Clang。例如,如果您使用 Ubuntu,您可以安装 build-essential 软件包。在 macOS 上,您可以通过运行 $ xcode-select --install 获取 C 编译器。对于 Windows,这意味着安装 Visual Studio 2022。在提示选择工作负载时,包括 "使用 C++ 进行桌面开发"、"Windows 10 或 11 SDK" 和英语语言包,以及您需要的任何其他语言包。

cargo install qsv --locked --features all_features

二进制文件将安装到 ~/.cargo/bin

要安装不同的 变体 并启用可选功能,请使用 cargo --features(有关更多信息,请参见 功能标志

# to install qsv with all features enabled
cargo install qsv --locked --bin qsv --features feature_capable,apply,luau,fetch,foreach,python,to,self_update,polars
# or shorthand
cargo install qsv --locked --bin qsv -F all_features

# or enable only the apply and polars features
cargo install qsv --locked --bin qsv -F feature_capable,apply,polars

# or to install qsvlite
cargo install qsv --locked --bin qsvlite -F lite

# or to install qsvdp
cargo install qsv --locked --bin qsvdp -F datapusher_plus,luau,polars

注意:如果在运行cargo install时出现编译错误,请使用选项4从源代码编译,使用cargo build。错误通常是由于cargo install只使用了qsv依赖的最新版本,而忽略了我们Cargo.toml中的patch.crates-io条目。

选项4:从源代码编译

从源代码编译也类似[^2]

git clone https://github.com/jqnatividad/qsv.git
cd qsv
cargo build --release --locked --bin qsv --features all_features

编译的二进制文件将位于./target/release/

要编译不同的变体并启用可选的特性

# to compile qsv with all features enabled
cargo build --release --locked --bin qsv --features feature_capable,apply,luau,fetch,foreach,python,to,self_update,polars
# shorthand
cargo build --release --locked --bin qsv -F all_features

# or build qsv with only the fetch and foreach features enabled
cargo build --release --locked --bin qsv -F feature_capable,fetch,foreach

# for qsvlite
cargo build --release --locked --bin qsvlite -F lite

# for qsvdp
cargo build --release --locked --bin qsvdp -F datapusher_plus,luau,polars

注意:要使用Rust nightly构建,请参阅Nightly Release Builds

变体

qsv有四个二进制变体

  • qsv - 具有功能的(✨),具有预构建的二进制文件启用所有适用的功能,除了Python [^3]
  • qsvpy - 与qsv相同,但启用了Python功能。有三个子变体可供选择 - qsvpy310,qsvpy311 & qsvpy312 - 分别使用Python 3.10,3.11 & 3.12的最新补丁版本进行编译。
  • qsvlite - 禁用所有功能 (~13% 的 qsv 大小)
  • qsvdp - 优化用于与DataPusher+一起使用,只包含DataPusher+相关的命令;嵌入的luau解释器;applydp,是apply功能的精简版;禁用了--progressbar选项;仅检查新版本的自更新,需要显式使用--update (~12% 的 qsv 大小)。

注意:qsv还有带有“p”后缀的“便携”子变体 - qsvpqsvpliteqsvpdp。这些子变体在编译时没有启用任何CPU功能。如果您在运行常规qsv二进制文件时遇到“非法指令”错误,请使用这些子变体。

[^3]: 默认情况下,musl平台的预构建二进制文件不启用luau功能。我们使用GitHub的基于glibc的动作运行器进行交叉编译musl二进制文件,而luau功能需要将主机OS的libc库静态链接。这对于将目标编译为musl的glibc运行器来说是不可能的。

Shell Completion

qsv具有广泛的、可扩展的shell completion支持。它目前支持以下shell:bashzshpowershellfishnushellfig & elvish

要启用shell completion,请参阅Shell Completion文档。如果您使用Bash,还可以按照100.dathere.com中的逐步教程进行操作。

正则表达式语法

选项--select和多个命令(applyapplydpdatefmtexcludefetchpostreplaceschemasearchsearchsetselectsqlpstats)允许用户指定正则表达式。我们使用regex库来解析、编译和执行这些表达式。[^4]

[^4]:这与ripgrep使用的正则表达式引擎相同,ripgrep是一个快速的grep替代品,为Visual Studio的神奇“在文件中查找”功能提供动力。

其语法可在此处找到,并且“与其他正则表达式引擎类似,但缺乏一些无法高效实现的特性。这包括但不限于前瞻和后引用。作为交换,此库中所有正则表达式搜索的最坏情况时间复杂度为O(m * n),其中m与正则表达式的大小成正比,n与搜索字符串的大小成正比。”

如果您想测试正则表达式,regex101支持regex库使用的语法。只需选择“Rust”版本。

文件格式

qsv识别UTF-8/ASCII编码的CSV(.csv)、SSV(.ssv)和TSV文件(.tsv.tab)。假设CSV文件以逗号(`,`)作为分隔符,SSV文件以分号(`;`)作为分隔符,TSV文件以制表符(`\t`)作为分隔符。分隔符是一个可以由--delimiter命令行选项或QSV_DEFAULT_DELIMITER环境变量设置的单个ASCII字符,或者在设置QSV_SNIFF_DELIMITER时自动检测。

当使用--output选项时,qsv将使用UTF-8编码文件,并根据文件扩展名自动更改生成文件中使用的分隔符,例如,对于.csv文件使用逗号,对于.ssv文件使用分号,对于.tsv.tab文件使用制表符。

JSON文件被识别并使用json命令转换为CSV。JSONL/NDJSON文件也被识别,并使用jsonltojsonl命令分别转换为从CSV。

在未使用--new-column选项调用时,fetchfetchpost命令也会生成JSONL文件,并且使用--report选项时,会生成TSV文件。

命令 excelsafenamessniffsortcheckvalidate 会根据 JSON API 1.1 规范 生成包含 JSON 选项的 JSON 文件,因此可以返回详细且便于机器处理的元数据,供其他系统使用。

命令 schema 会生成一个以 ".schema.json" 为扩展名的 JSON Schema 验证(草案 7) 文件,可以与 validate 命令一起使用,验证具有相同架构的其他 CSV 文件。

命令 excel 识别 Excel 和 Open Document 电子表格 (ODS) 文件(文件扩展名为 .xls.xlsx.xlsm.xlsb.ods)。

关于 Excel,如果您在 Excel 中打开由 qsv 生成的 CSV 文件时遇到问题,请将 QSV_OUTPUT_BOM 环境变量设置为在生成的 CSV 文件开头添加一个 字节顺序标记。这是针对 Excel 的 UTF-8 编码检测错误 的解决方案。

命令 to 将 CSV 转换为 .xlsxParquetData Package 文件,并填充 PostgreSQLSQLite 数据库。

命令 sqlp 以 CSV、JSON、JSONL、Parquet、Apache Arrow IPCApache AVRO 格式返回查询结果。Polars SQL 还支持通过其 read_csvread_ndjsonread_parquetread_ipc 表函数 直接以各种格式读取外部文件。

命令 sniff 还可以使用 --no-infer--just-mime 选项检测任何文件的 MIME 类型,无论是本地还是远程(支持 http 和 https 方案)。它可以检测超过 130 种文件格式,包括 MS Office/Open Document 文件、JSON、XML、PDF、PNG、JPEG 以及像 GPX、GML、KML、TML、TMX、TSX、TTML 这样的专业地理空间格式。点击 这里 查看完整列表。

扩展输入支持

命令 catheaderssqlpto 支持扩展输入(🗄️)。如果输入是 - 或空,则命令将尝试使用 stdin 作为输入。如果不是,它将检查是否为目录,如果是,则将目录中的所有文件作为输入文件。

如果是文件,它将首先检查它是否有 .infile-list 扩展名。如果有,它将加载文本文件并将每一行解析为输入文件路径。这是一种更快且更方便的处理大量输入文件的方法,无需将它们作为单独的命令行参数传递。此外,文件路径可以在文件系统的任何位置,甚至在不同卷上。如果输入文件路径不完全限定,它将被视为相对于当前工作目录的相对路径。空行和以 # 开头的行将被忽略。无效的文件路径将被记录为警告并跳过。

对于目录和 .infile-list 输入,具有 .sz 扩展名的 Snappy 压缩文件将被自动解压。

最后,如果它只是一个普通文件,它将被视为普通输入文件。

Snappy 压缩/解压

qsv 支持使用 Snappy 帧格式 进行 自动压缩/解压。Snappy 被选择替代更流行的压缩格式(如 gzip),因为它是为 高性能流压缩和解压(高达 2.58 gb/sec 的压缩,0.89 gb/sec 的解压)而设计的。

对于除 indexextdedupextsort 命令之外的所有命令,如果输入文件具有 ".sz" 扩展名,qsv 将在读取时 自动 进行流式解压。此外,如果输入文件具有扩展的 CSV/TSV ".sz" 扩展名(例如 nyc311.csv.sz/nyc311.tsv.sz/nyc311.tab.sz),qsv 还将使用文件扩展名来确定要使用的分隔符。

同样,如果 --output 文件具有 ".sz" 扩展名,qsv 将在写入时 自动 进行流式压缩。如果输出文件具有扩展的 CSV/TSV ".sz" 扩展名,qsv 还将使用文件扩展名来确定要使用的分隔符。

然而请注意,压缩文件无法被索引,因此索引加速命令(frequencyschemasplitstatstojsonl)将不会多线程执行。在没有索引的情况下,随机访问也被禁用,因此 slice 不会立即执行,而 luau 的随机访问模式将不可用。

还有一个专门的 snappy 命令,包含四个用于直接 Snappy 文件操作的子命令 — 一个多线程的 compress 子命令(比内置的单线程自动压缩快 4-5 倍);一个具有详细压缩元数据的 decompress 子命令;一个用于快速检查文件是否具有 Snappy 标头的 check 子命令;以及一个用于确认 Snappy 文件是否有效的 validate 子命令。

snappy 命令可以用于压缩/解压任何文件,而不仅仅是 CSV/TSV 文件。

使用 snappy 命令,我们可以将纽约市的 311 数据(15gb,2800 万行)使用多线程的 compress 子命令压缩到 4.95 gb,耗时 5.77 秒 - 以 2.58 gb/sec 的速度压缩,压缩比 0.33(3.01:1)。使用 snappy decompress,我们可以在 16.71 秒 内循环解压相同的文件 - 以 0.89 gb/sec 的速度。

zip 3.0 相比,它在相同的机器上压缩相同的文件到 2.9 gb,耗时 248.3 秒 - 慢 43 倍,速度为 0.06 gb/sec,压缩比为 0.19(5.17:1),仅额外节省了 14%(2.45 gb)的空间。zip 还花费了 4.3 倍更长的时间在 72 秒 内循环解压相同的文件 - 速度为 0.20 gb/sec

RFC 4180 CSV 标准

qsv 遵循 RFC 4180 CSV 标准。然而,在现实生活中,CSV 格式有很大差异,qsv 实际上并不完全符合规范,因此它可以处理“真实世界”的 CSV 文件。qsv 利用出色的 Rust CSV 包来读取/写入 CSV 文件。

点击这里了解qsv如何使用此crate符合标准。

处理“非典型”CSV文件时,您可以使用inputfmt命令将它们规范化为符合RFC 4180。

UTF-8编码

qsv需要UTF-8编码的输入(其中ASCII是其子集)。

如果您需要重新编码CSV/TSV文件,可以使用input命令将其“有损保存”为UTF-8 - 用U+FFFD替换字符)替换无效的UTF-8序列。

或者,如果您想真正转换到UTF-8,可以使用iconv等几个实用程序在Linux/macOSWindows上执行此操作。

Windows Powershell和Windows Excel使用注意事项

与其他现代操作系统不同,微软Windows的默认编码是UTF16-LE。这将导致在Powershell中将qsv的输出重定向到CSV文件并在Excel中打开它时出现问题 - 所有内容都将位于第一列,因为UTF16-LE编码的CSV文件不会被Excel正确识别。

# the following command will produce a UTF16-LE encoded CSV file on Windows
qsv stats wcp.csv > wcpstats.csv

这很奇怪,因为您可能会认为微软自己的Excel会正确识别UTF16-LE编码的CSV文件。无论如何,为了在Windows上创建正确UTF-8编码的文件,请使用--output选项。

# so instead of redirecting stdout to a file on Windows
qsv stats wcp.csv > wcpstats.csv

# do this instead, so it will be properly UTF-8 encoded
qsv stats wcp.csv --output wcpstats.csv

或者,qsv可以在CSV的开头添加一个字节顺序标记(BOM)来指示它是UTF-8编码的。您可以通过将环境变量QSV_OUTPUT_BOM设置为1来做到这一点。

这将允许Windows上的Excel正确识别CSV文件为UTF-8编码。

请注意,这并不是macOS上的Excel的问题,因为macOS(如大多数其他*nix系统)使用UTF-8作为其默认编码。

这也不是在其他操作系统上生成的qsv输出文件的问题,因为Windows上的Excel可以正确识别UTF-8编码的CSV文件。

解释器

对于复杂的数据处理任务,您可以使用Luau和Python脚本。

对于复杂的数据处理任务,建议使用Luau而不是Python,因为Luau更快,更节省内存,没有外部依赖,并且有几个与qsv DSL类似的数据处理辅助函数。

有关更多信息,请参阅Luau与Python

内存管理

qsv支持三种内存分配器 - mimalloc(默认)、jemalloc和标准分配器。
有关更多信息,请参阅内存分配器

它还具有内存不足预防功能,有两种模式 - NORMAL(默认)和CONSERVATIVE。
有关更多信息,请参阅内存不足预防

环境变量和dotenv文件支持

qsv支持大量环境变量,并支持.env文件来设置它们。

有关详细信息,请参阅环境变量dotenv.template.yaml文件。

功能标志

qsv有几个功能标志,可用于启用/禁用可选功能。

有关更多信息,请参阅功能

最低支持的Rust版本

qsv的MSRV策略是要求由Homebrew支持的最新稳定Rust版本,目前是Homebrew支持的版本,目前为HomeBrew。qsv本身可能会升级其MSRV,但只有在Homebrew支持最新的Rust稳定版本后,才会发布新的qsv版本。

目标/非目标

QuickSilver的目标(按优先级排序)是:

QuickSilver 的非目标是

  • 尽可能小 - qsv 的设计理念是小,但不是以性能、功能、可组合性、可移植性、可用性、安全性或可维护性为代价。然而,我们有一个 qsvlite 变体,其大小约为 qsv 的 13%,还有一个 qsvdp 变体,其大小约为 qsv 的 12%。然而,这些变体具有减少的功能。此外,一些命令位于功能标志之后,因此您可以根据需要编译 qsv。
  • 多语言 - qsv 的 使用文本消息 仅支持英语。目前没有支持其他语言的计划。这并不意味着它只能处理英语输入文件。
    它可以处理任何语言的格式良好的 CSV,只要其编码为 UTF-8。此外,它支持除逗号之外的替代分隔符;apply whatlang 操作可以检测 69 种语言;并且其 apply thousands, currency and eudex 操作支持不同的语言和地区约定,用于数字、货币和日期解析/格式化。
    最后,尽管 geocode 命令的默认 Geonames 索引仅支持英语,但可以使用带有 --languages 选项的 geocode index-update 子命令来重建索引,以返回多种语言中的地点名称(支持 254 种语言)。

测试

qsv 在 tests 目录下有约 1,550 个测试。每个命令都有自己的测试套件,存放在一个单独的文件中,命名规范为 test_<COMMAND>.rs。除了防止回归外,这些测试还作为良好的示例,经常被链接到每个相应命令的使用文本中。

测试每个二进制变体

# to test qsv
cargo test --features all_features

# to test qsvlite
cargo test --features lite
# to test all tests with "stats" in the name with qsvlite
cargo test stats --features lite

# to test qsvdp
cargo test --features datapusher_plus,luau,polars

# to test a specific command
# here we test only stats and use the
# t alias for test and the -F shortcut for --features
cargo t stats -F all_features

# to test a specific command with a specific feature
# here we test only luau command with the luau feature
cargo t luau -F feature_capable,luau

# to test the count command with multiple features
# we use "test_count" as we don't want to run other tests
# that have "count" in the testname - e.g. test_geocode_countryinfo
cargo t test_count -F feature_capable,luau,polars

# to test using an alternate allocator
# other than the default mimalloc allocator
cargo t --no-default-features -F all_features,jemallocator

许可证

双许可 MIT 或 UNLICENSE

FOSSA Status

来源

Quicksilver (qsv) 是流行的 xsv 工具的分支,自 xsv 0.13.0 于 2018 年 5 月发布以来合并了多个待处理 PR。在 xsv 的 20 个命令的基础上,它增加了许多新功能;39 个额外的命令;4 个 apply 子命令和 38 个操作;5 个 to 子命令;3 个 cat 子命令;7 个 geocode 子命令和 4 个索引操作;以及 4 个 snappy 子命令。有关更多详细信息,请参阅 FAQ

赞助商

qsv 的制作得以实现
datHere Logo
基于标准的,最佳的开源解决方案
使您的 数据有用、可用且被使用。

命名冲突

此项目与 Intel 的 Quick Sync Video 无关。

依赖关系

~38–91MB
~1.5M SLoC