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 解析实现
每月868次下载
1.5MB
32K SLoC
qsv: 极快CSV数据处理工具包
目录 | |
---|---|
![]() 嗨,"Quicksilver"出发! 标志细节 |
qsv是一个用于查询、切片、 索引、分析、过滤、丰富、转换、 排序、验证、连接和转换CSV文件的命令行程序。 命令简单、可组合且 "极快"。 * 命令 * 安装选项 * 快速浏览 / 笔记本 / 课程与练习 * 食谱 * 常见问题解答 * 性能调整 * 👉 基准测试 🚀 * 环境变量 * 功能标志 * 目标/非目标 * 测试 * 纽约数据学校2022年/csv,conf,v8 幻灯片 * 赞助商 |
在 qsv.dathere.com 尝试一下!
命令 | 描述 |
---|---|
apply ✨🚀🧠🤖🔣👆 |
将一系列字符串、日期、数学和货币转换应用到给定的CSV列。它还包含一些基本的自然语言处理功能(相似度、情感分析、粗俗、eudex、语言和姓名性别检测)。 |
applydp 🚀🔣👆 ![]() |
applydp是apply 的精简版,只包含与Datapusher+相关的子命令/操作(仅提供qsvdp 二进制变体)。 |
behead | 从CSV中删除表头。 |
cat 🗄️ |
按行或按列连接CSV文件。 |
clipboard | 从剪贴板提供输入或将输出保存到剪贴板。 |
count 📇🏎️🐻❄️ |
计算CSV文件中的行数。对于15GB、27m行的纽约市311数据集,如果没有索引,则耗时11.87秒。如果有索引,则瞬间完成。如果启用了polars 功能,则使用Polars的多线程、内存映射CSV读取器,即使在没有索引的情况下也能快速计数。 |
datefmt 🚀👆 |
使用strftime日期格式说明符 将识别的日期字段(识别19种格式)格式化为指定的日期格式。 |
dedup 🤯🚀👆 |
删除重复行(另请参阅extdedup 、extsort 、sort 和sortcheck 命令)。 |
describegpt 🌐🤖🪄 |
使用OpenAI的API或符合OpenAI API规范的另一个API(如Ollama或Jan)的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 的常量时间索引/随机访问。使用索引,count 、sample 和 slice 的工作是瞬时的;在 luau 中启用了随机访问模式;并且为 frequency 、split 、stats 、schema 和 tojsonl 命令启用了多线程(🏎️)。 |
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 👑 ✨📇🌐🔣 ![]() |
通过为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![]() |
修改CSV的标题,只包含"安全"名称 - 保证"数据库就绪"/"CKAN就绪"的名称。 |
sample 📇🌐🏎️ |
使用蓄水池抽样从CSV中随机抽取行(可选种子),使用与样本大小成比例的内存。如果存在索引,则使用随机索引和常量内存。 |
schema 📇😣🏎️👆🪄 |
从CSV数据中推断模式,包括数据类型、域/范围验证,并以JSON Schema格式输出。如果存在索引,则使用多线程来加快速度。请参阅validate 命令,以使用生成的JSON Schema验证是否类似的CSV符合该模式。 |
search 👆 |
在CSV上运行正则表达式。将正则表达式应用于所选字段并仅显示匹配的行。 |
searchset 👆 |
在单次遍历中运行多个正则表达式。将正则表达式应用于每个字段并仅显示匹配的行。 |
select 👆 |
选择、重新排序、反转、重复或删除列。 |
slice 📇🏎️ |
从CSV的任何部分切片行。如果存在索引,则只需解析切片中的行(而不是切片开始之前的所有行)。 |
snappy 🚀🌐 |
使用谷歌的 Snappy 框架格式(更多信息)对输入进行流压缩/解压缩。 |
sniff 🌐 ![]() |
快速嗅探并推断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文件转换为PostgreSQL、SQLite、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编码。 |
✨: 通过功能标志启用。
📇: 当可用时使用索引。
🤯: 将整个CSV加载到内存中,尽管dedup
、stats
和transpose
也有“流式”模式。
😣: 使用与CSV中列的基数成比例的额外内存。
🧠: 使用可用的会话间Redis/Disk缓存对昂贵的操作进行缓存。
🗄️: 扩展输入支持。
🐻❄️: 由提供支持的命令。
🤖: 命令使用自然语言处理和通用人工智能技术。
🏎️: 当有索引(📇)时,多线程且/或更快。
🚀: 即使没有索引也支持多线程。
: 有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.2、AVX2、AVX512等)和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 也由几个软件包管理器和发行版提供。请查看每个软件包管理器/发行版的文档以获取安装说明。
请注意,这些软件包管理器/发行版提供的 qsv 启用了不同的功能(例如,Homebrew 仅启用 apply
和 luau
功能。但是,它将自动安装 bash
、fish
和 zsh
终端的 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”后缀的“便携”子变体 -
qsvp
,qsvplite
和qsvpdp
。这些子变体在编译时没有启用任何CPU功能。如果您在运行常规qsv二进制文件时遇到“非法指令”错误,请使用这些子变体。
[^3]: 默认情况下,musl平台的预构建二进制文件不启用luau
功能。我们使用GitHub的基于glibc的动作运行器进行交叉编译musl二进制文件,而luau
功能需要将主机OS的libc库静态链接。这对于将目标编译为musl的glibc运行器来说是不可能的。
Shell Completion
qsv具有广泛的、可扩展的shell completion支持。它目前支持以下shell:bash
,zsh
,powershell
,fish
,nushell
,fig
& elvish
。
要启用shell completion,请参阅Shell Completion文档。如果您使用Bash,还可以按照100.dathere.com中的逐步教程进行操作。
正则表达式语法
选项--select
和多个命令(apply
、applydp
、datefmt
、exclude
、fetchpost
、replace
、schema
、search
、searchset
、select
、sqlp
和stats
)允许用户指定正则表达式。我们使用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文件也被识别,并使用jsonl
和tojsonl
命令分别转换为从CSV。
在未使用--new-column
选项调用时,fetch
和fetchpost
命令也会生成JSONL文件,并且使用--report
选项时,会生成TSV文件。
命令 excel
、safenames
、sniff
、sortcheck
和 validate
会根据 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 转换为 .xlsx
、Parquet 和 Data Package 文件,并填充 PostgreSQL 和 SQLite 数据库。
命令 sqlp
以 CSV、JSON、JSONL、Parquet、Apache Arrow IPC 和 Apache AVRO 格式返回查询结果。Polars SQL 还支持通过其 read_csv
、read_ndjson
、read_parquet
和 read_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 这样的专业地理空间格式。点击 这里 查看完整列表。
扩展输入支持
命令 cat
、headers
、sqlp
和 to
支持扩展输入(🗄️)。如果输入是 -
或空,则命令将尝试使用 stdin 作为输入。如果不是,它将检查是否为目录,如果是,则将目录中的所有文件作为输入文件。
如果是文件,它将首先检查它是否有 .infile-list
扩展名。如果有,它将加载文本文件并将每一行解析为输入文件路径。这是一种更快且更方便的处理大量输入文件的方法,无需将它们作为单独的命令行参数传递。此外,文件路径可以在文件系统的任何位置,甚至在不同卷上。如果输入文件路径不完全限定,它将被视为相对于当前工作目录的相对路径。空行和以 #
开头的行将被忽略。无效的文件路径将被记录为警告并跳过。
对于目录和 .infile-list
输入,具有 .sz
扩展名的 Snappy 压缩文件将被自动解压。
最后,如果它只是一个普通文件,它将被视为普通输入文件。
Snappy 压缩/解压
qsv 支持使用 Snappy 帧格式 进行 自动压缩/解压。Snappy 被选择替代更流行的压缩格式(如 gzip),因为它是为 高性能流压缩和解压(高达 2.58 gb/sec 的压缩,0.89 gb/sec 的解压)而设计的。
对于除 index
、extdedup
和 extsort
命令之外的所有命令,如果输入文件具有 ".sz" 扩展名,qsv 将在读取时 自动 进行流式解压。此外,如果输入文件具有扩展的 CSV/TSV ".sz" 扩展名(例如 nyc311.csv.sz/nyc311.tsv.sz/nyc311.tab.sz),qsv 还将使用文件扩展名来确定要使用的分隔符。
同样,如果 --output
文件具有 ".sz" 扩展名,qsv 将在写入时 自动 进行流式压缩。如果输出文件具有扩展的 CSV/TSV ".sz" 扩展名,qsv 还将使用文件扩展名来确定要使用的分隔符。
然而请注意,压缩文件无法被索引,因此索引加速命令(frequency
、schema
、split
、stats
、tojsonl
)将不会多线程执行。在没有索引的情况下,随机访问也被禁用,因此 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文件时,您可以使用input
和fmt
命令将它们规范化为符合RFC 4180。
UTF-8编码
qsv需要UTF-8编码的输入(其中ASCII是其子集)。
如果您需要重新编码CSV/TSV文件,可以使用input
命令将其“有损保存”为UTF-8 - 用�
(U+FFFD替换字符)替换无效的UTF-8序列。
或者,如果您想真正转换到UTF-8,可以使用iconv
等几个实用程序在Linux/macOS和Windows上执行此操作。
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支持的版本,目前为。qsv本身可能会升级其MSRV,但只有在Homebrew支持最新的Rust稳定版本后,才会发布新的qsv版本。
目标/非目标
QuickSilver的目标(按优先级排序)是:
- 尽可能快 - 为此,它有频繁的发布,积极的MSRV策略,利用CPU特性,采用各种缓存策略,使用HTTP/2,并在可能的情况下和有意义时使用多线程。更多信息请参阅性能。
- 能够处理非常大的文件 - 大多数qsv命令是流式的,使用常量内存,可以处理任意大小的CSV文件。对于那些需要将整个CSV加载到内存中的命令(用🤯表示),qsv有内存不足预防,批量处理策略和“外部”命令,使用磁盘处理大于内存的文件。更多信息请参阅内存管理。
- 完整的数据处理工具集 - qsv的目标是成为一个全面的数据处理工具集,您可以用它进行快速分析和调查,同时也足够健壮,可以用于生产数据管道。它的许多命令针对常见的数据处理任务,并且可以与基于Luau的DSL组合/组合成复杂的数据处理脚本。
Luau还将作为整个库的骨干 - 用于常见任务的重复使用脚本(例如,街道级地理编码、删除PII、数据增强等),这些脚本允许轻松修改参数。 - 可组合/可互操作 - qsv设计成可组合的,重点是与其他常见CLI工具(如'awk'、'xargs'、'ripgrep'、'sed'等)以及众所周知的ETL/ELT工具(如Airbyte、Airflow、Pentaho Kettle等)进行互操作性。它的命令可以通过管道与其他工具结合使用,并支持其他常见文件格式,如JSON/JSONL、Parquet、Arrow IPC、Avro、Excel、ODS、PostgreSQL、SQLite等。更多信息请参阅文件格式。
- 尽可能便携 - qsv设计成便携式,有多个平台的安装程序,并集成了自我更新机制。按优先顺序,它支持Linux、macOS和Windows。更多信息请参阅安装选项。
- 尽可能简单易用 - qsv 的设计理念是易于使用。在命令行接口方面,尽可能简单。它的命令有众多选项,但默认设置合理。使用说明是为数据分析人员编写的,而不是为开发人员;使用说明中包含大量示例,测试也作为示例使用。使用 qsv pro,它具有更强大的功能,同时通过图形用户界面使其更易于使用。
- 尽可能安全 - qsv 的设计理念是安全。它没有外部运行时依赖,是用 Rust 编写的,其代码库通过自动化的 DevSkim、"cargo audit" 和 Codacy Github Actions 工作流程进行安全漏洞审计。
它使用最新的稳定 Rust 版本,具有积极的 MSRV 政策和所有依赖项的最新版本。它有一个广泛的测试套件,包括 ~1,550 个测试,其中包括几个 属性测试,这些测试随机生成常用命令的参数。
其预构建的二进制存档是 zipsigned 的,因此您可以 验证其完整性。其自更新机制在应用更新之前自动验证预构建二进制存档的完整性。有关更多信息,请参阅 安全。 - 尽可能容易贡献 - qsv 的设计理念是易于贡献,重点在于可维护性。其模块化架构允许通过功能标志轻松添加自包含的命令,源代码有大量注释,使用说明嵌入其中,并提供辅助函数,使得创建额外的命令和支持测试变得容易。有关更多信息,请参阅 功能 和 贡献。
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。
来源
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。
赞助商
命名冲突
此项目与 Intel 的 Quick Sync Video 无关。
依赖关系
~38–91MB
~1.5M SLoC