medialab/xan
GitHub: medialab/xan
一款基于 Rust 编写的高性能命令行 CSV 处理工具,专为在终端中快速操作、转换和可视化大型表格数据而设计。
Stars: 4318 | Forks: 85
[](https://github.com/medialab/xan/actions) [](https://doi.org/10.5281/zenodo.15310200)
# `xan`,CSV 魔术师
`xan` 是一个命令行工具,可用于直接在 shell 中处理 CSV 文件。
它使用 Rust 编写,旨在实现最快的运行速度并尽可能降低内存消耗,能够非常轻松地处理大型 CSV 文件(GB 级别)。它采用了一种新颖的 [SIMD](https://en.wikipedia.org/wiki/Single_instruction,_multiple_data) CSV [解析器](https://docs.rs/simd-csv),并且能够(通过多线程)并行化某些计算,以使部分任务能以你计算机允许的最快速度完成。
它可以轻松地预览、过滤、切片、聚合、排序、关联 CSV 文件,并提供了大量可组合的命令,这些命令可以串联在一起以执行各种典型的任务。
`xan` 还提供了自己的表达式语言,因此你可以执行那些仅靠简单命令无法完成的复杂任务。这种极简的语言专为 CSV 数据量身定制,并且比执行 Python、Lua、JavaScript 等典型的动态类型语言要*快得多*。
请注意,该工具最初是 [BurntSushi](https://github.com/BurntSushi) 的 [`xsv`](https://github.com/BurntSushi/xsv) 的一个分支(fork),但目前几乎已被完全重写,以适应 [SciencesPo's médialab](https://github.com/medialab) 的使用场景,这些场景根植于面向社会科学的网络数据收集与分析(你可能认为 CSV 到现在早已过时,但在草率下结论之前,请先阅读我们写给该格式的[情书](./docs/LOVE_LETTER.md))。
因此,`xan` 超越了典型的数据操作范畴,并提供了与词汇计量学、图论甚至网页抓取相关的实用工具。
除了 CSV 数据之外,`xan` 还能够处理来自许多不同学科的各种类 CSV 数据格式,例如网络归档(`.cdx`)或生物信息学(`.vcf`、`.gtf`、`.sam`、`.bed` 等)。`xan` 还能够使用 [`xan to`](./docs/cmd/to.md) 和 [`xan from`](./docs/cmd/from.md) 在多种数据格式(如 json、excel 文件、numpy 数组等)之间进行相互转换。有关更多详细信息,请参阅[此](#supported-file-formats)章节。
最后,`xan` 可用于在终端中显示 CSV 文件以便于浏览,甚至可用于绘制基本的数据可视化图表:
|*view 命令*|*flatten 命令*|
|:---:|:---:|
|||
|__*分类直方图*__|__*散点图*__|
|||
|__*分类散点图*__|__*直方图*__|
|||
|__*并行处理*__|__*时间序列*__|
|||
|__*小倍数(网格分面)*__|__*分组视图*__|
|||
|__*相关矩阵热力图*__|__*热力图*__|
|||
## 概要
* [如何安装](#how-to-install)
* [Cargo](#cargo)
* [Scoop (Windows)](#scoop-windows)
* [Homebrew (macOS)](#homebrew-macos)
* [Arch Linux](#arch-linux)
* [NetBSD](#netbsd)
* [Nix](#nix)
* [Pixi](#pixi-linux-macos-windows)
* [Conda Forge](#conda-forge)
* [预编译二进制文件](#pre-built-binaries)
* [安装补全](#installing-completions)
* [快速浏览](#quick-tour)
* [学习](#learning)
* [可用命令](#available-commands)
* [通用标志与 IO 模型](#general-flags-and-io-model)
* [获取帮助](#getting-help)
* [关于输入与输出格式](#regarding-input--output-formats)
* [处理无表头的 CSV 文件](#working-with-headless-csv-file)
* [关于 stdin](#regarding-stdin)
* [关于 stdout](#regarding-stdout)
* [支持的文件格式](#supported-file-formats)
* [压缩文件](#compressed-files)
* [关于颜色](#regarding-color)
* [表达式语言参考](#expression-language-reference)
* [新闻](#news)
* [如何引用?](#how-to-cite)
* [常见问题](#frequently-asked-questions)
## 如何安装
### Cargo
`xan` 可以使用 cargo 安装(它通常随 [Rust](https://www.rust-lang.org/tools/install) 一起提供):
```
cargo install xan --locked
```
*可选特性*
某些特性默认不会被构建,因为它们在编译时间或可执行文件大小方面代价过高。以下是这些可选特性的列表:
* `parquet`:启用 `xan from -f parquet`
你可以像这样指定你想要的可选特性:
```
# 启用所有可选特性
cargo install xan --locked --all-features
# 仅启用特定特性
cargo install xan --locked --features parquet
```
你还可以调整构建标志,以确保 Rust 编译器能够利用你 CPU 的所有特性:
```
CARGO_BUILD_RUSTFLAGS='-C target-cpu=native' cargo install xan --locked
```
你也可以像这样安装最新的开发版本:
```
cargo install --git https://github.com/medialab/xan --locked
```
### Scoop (Windows)
在 Windows 上,可以使用 [Scoop](https://scoop.sh/) 安装 `xan`:
```
scoop bucket add extras
scoop install xan
```
### Homebrew (macOS)
在 macOS 上,可以通过 [Homebrew](https://brew.sh/) 像这样安装 `xan`:
```
brew install xan
```
### Arch Linux
你可以使用 `pacman` 从 [extra 仓库](https://archlinux.org/packages/extra/x86_64/xan/)安装 `xan`:
```
sudo pacman -S xan
```
### NetBSD
官方仓库中提供了该软件包。要安装 `xan`,只需运行:
```
pkgin install xan
```
### Nix
`xan` 已打包适用于 Nix,并从 25.05 版本起在 Nixpkgs 中可用。要安装它,你可以将其作为 `pkgs.xan` 添加到你的 `environment.systemPackages` 中,或者使用 `nix-shell` 进入一个临时 shell。
```
nix-shell -p xan
```
### Pixi (Linux, macOS, Windows)
可以使用 [Pixi](https://pixi.sh/latest/) 包管理器在 Linux、macOS 和 Windows 上安装 `xan`:
```
pixi global install xan
```
### Conda Forge
可以通过 [conda-forge](https://conda-forge.org/) 像这样安装 `xan`:
```
conda install conda-forge::xan
```
### 预编译二进制文件
每个 GitHub [发布](https://github.com/medialab/xan/releases/latest)页面都附带了预编译的二进制文件。
目前支持的目标包括:
- `x86_64-apple-darwin`
- `x86_64-unknown-linux-gnu`
- `x86_64-unknown-linux-musl`
- `x86_64-pc-windows-msvc`
- `aarch64-apple-darwin`
- `aarch64-unknown-linux-gnu`
`ppc64le` 目标尚未由 CI 构建,但如果你需要,仍然可以在 `conda-forge` 软件包的[文件](https://anaconda.org/conda-forge/xan/files)中找到预编译的二进制文件。
欢迎提交 PR,通过添加相关目标来改进 CI。
### 安装补全
请注意,`xan` 还为命令和表头/列名提供了便捷的自动补全功能,你可以通过 `xan completions` 命令进行安装。
运行以下命令以了解如何安装这些补全:
```
xan completions -h
```
对于 `zsh`,你可以将补全文件添加到 `~/.zfunc`:
```
mkdir -p ~/.zfunc
xan completions zsh > ~/.zfunc/_xan
```
然后在你的 `~/.zshrc` 中的 `compinit` 之前添加以下内容:
```
fpath=(~/.zfunc $fpath)
autoload -Uz compinit
compinit
```
## 快速浏览
让我们通过探索一个法国媒体语料库来了解最常用的 `xan` 命令:
### 下载语料库
```
curl -LO https://github.com/medialab/corpora/raw/master/polarisation/medias.csv
```
### 显示文件表头
```
xan headers medias.csv
```
```
0 webentity_id
1 name
2 prefixes
3 home_page
4 start_pages
5 indegree
6 hyphe_creation_timestamp
7 hyphe_last_modification_timestamp
8 outreach
9 foundation_year
10 batch
11 edito
12 parody
13 origin
14 digital_native
15 mediacloud_ids
16 wheel_category
17 wheel_subcategory
18 has_paywall
19 inactive
```
### 统计行数
```
xan count medias.csv
```
```
478
```
### 在终端预览文件
```
xan view medias.csv
```
```
Displaying 5/20 cols from 10 first rows of medias.csv
┌───┬───────────────┬───────────────┬────────────┬───┬─────────────┬──────────┐
│ - │ name │ prefixes │ home_page │ … │ has_paywall │ inactive │
├───┼───────────────┼───────────────┼────────────┼───┼─────────────┼──────────┤
│ 0 │ Acrimed.org │ http://acrim… │ http://ww… │ … │ false │ │
│ 1 │ 24matins.fr │ http://24mat… │ https://w… │ … │ false │ │
│ 2 │ Actumag.info │ http://actum… │ https://a… │ … │ false │ │
│ 3 │ 2012un-Nouve… │ http://2012u… │ http://ww… │ … │ false │ │
│ 4 │ 24heuresactu… │ http://24heu… │ http://24… │ … │ false │ │
│ 5 │ AgoraVox │ http://agora… │ http://ww… │ … │ false │ │
│ 6 │ Al-Kanz.org │ http://al-ka… │ https://w… │ … │ false │ │
│ 7 │ Alalumieredu… │ http://alalu… │ http://al… │ … │ false │ │
│ 8 │ Allodocteurs… │ http://allod… │ https://w… │ … │ false │ │
│ 9 │ Alterinfo.net │ http://alter… │ http://ww… │ … │ │ true │
│ … │ … │ … │ … │ … │ … │ … │
└───┴───────────────┴───────────────┴────────────┴───┴─────────────┴──────────┘
```
在 unix 系统上,请毫不犹豫地使用 `-p` 标志,它会自动将全部输出转发给合适的分页器(pager),方便你浏览所有列。
### 读取第一行的扁平化表示
```
# 注意:去掉 -c 以避免截断值
xan flatten -c medias.csv
```
```
Row n°0
───────────────────────────────────────────────────────────────────────────────
webentity_id 1
name Acrimed.org
prefixes http://acrimed.org|http://acrimed69.blogspot…
home_page http://www.acrimed.org
start_pages http://acrimed.org|http://acrimed69.blogspot…
indegree 61
hyphe_creation_timestamp 1560347020330
hyphe_last_modification_timestamp 1560526005389
outreach nationale
foundation_year 2002
batch 1
edito media
parody false
origin france
digital_native true
mediacloud_ids 258269
wheel_category Opinion Journalism
wheel_subcategory Left Wing
has_paywall false
inactive
Row n°1
───────────────────────────────────────────────────────────────────────────────
webentity_id 2
...
```
### 搜索行
```
xan search -s outreach internationale medias.csv | xan view
```
```
Displaying 4/20 cols from 10 first rows of
┌───┬──────────────┬────────────────────┬───┬─────────────┬──────────┐
│ - │ webentity_id │ name │ … │ has_paywall │ inactive │
├───┼──────────────┼────────────────────┼───┼─────────────┼──────────┤
│ 0 │ 25 │ Businessinsider.fr │ … │ false │ │
│ 1 │ 59 │ Europe-Israel.org │ … │ false │ │
│ 2 │ 66 │ France 24 │ … │ false │ │
│ 3 │ 220 │ RFI │ … │ false │ │
│ 4 │ 231 │ fr.Sott.net │ … │ false │ │
│ 5 │ 246 │ Voltairenet.org │ … │ true │ │
│ 6 │ 254 │ Afp.com /fr │ … │ false │ │
│ 7 │ 265 │ Euronews FR │ … │ false │ │
│ 8 │ 333 │ Arte.tv │ … │ false │ │
│ 9 │ 341 │ I24News.tv │ … │ false │ │
│ … │ … │ … │ … │ … │ … │
└───┴──────────────┴────────────────────┴───┴─────────────┴──────────┘
```
### 选择某些列
```
xan select foundation_year,name medias.csv | xan view
```
```
Displaying 2 cols from 10 first rows of
┌───┬─────────────────┬───────────────────────────────────────┐
│ - │ foundation_year │ name │
├───┼─────────────────┼───────────────────────────────────────┤
│ 0 │ 2002 │ Acrimed.org │
│ 1 │ 2006 │ 24matins.fr │
│ 2 │ 2013 │ Actumag.info │
│ 3 │ 2012 │ 2012un-Nouveau-Paradigme.com │
│ 4 │ 2010 │ 24heuresactu.com │
│ 5 │ 2005 │ AgoraVox │
│ 6 │ 2008 │ Al-Kanz.org │
│ 7 │ 2012 │ Alalumieredunouveaumonde.blogspot.com │
│ 8 │ 2005 │ Allodocteurs.fr │
│ 9 │ 2005 │ Alterinfo.net │
│ … │ … │ … │
└───┴─────────────────┴───────────────────────────────────────┘
```
### 文件排序
```
xan sort -s foundation_year medias.csv | xan view -s name,foundation_year
```
```
Displaying 2 cols from 10 first rows of
┌───┬────────────────────────────────────┬─────────────────┐
│ - │ name │ foundation_year │
├───┼────────────────────────────────────┼─────────────────┤
│ 0 │ Le Monde Numérique (Ouest France) │ │
│ 1 │ Le Figaro │ 1826 │
│ 2 │ Le journal de Saône-et-Loire │ 1826 │
│ 3 │ L'Indépendant │ 1846 │
│ 4 │ Le Progrès │ 1859 │
│ 5 │ La Dépêche du Midi │ 1870 │
│ 6 │ Le Pélerin │ 1873 │
│ 7 │ Dernières Nouvelles d'Alsace (DNA) │ 1877 │
│ 8 │ La Croix │ 1883 │
│ 9 │ Le Chasseur Francais │ 1885 │
│ … │ … │ … │
└───┴────────────────────────────────────┴─────────────────┘
```
### 基于某列对文件去重
```
# 我们语料库中的某些媒体在 mediacloud.org 上具有相同的 id
xan dedup -s mediacloud_ids medias.csv | xan count && xan count medias.csv
```
```
457
478
```
也可以在排序的同时进行去重:
```
xan sort -s mediacloud_ids -u medias.csv
```
### 计算频率表
```
xan frequency -s edito medias.csv | xan view
```
```
Displaying 3 cols from 5 rows of
┌───┬───────┬────────────┬───────┐
│ - │ field │ value │ count │
├───┼───────┼────────────┼───────┤
│ 0 │ edito │ media │ 423 │
│ 1 │ edito │ individu │ 30 │
│ 2 │ edito │ plateforme │ 14 │
│ 3 │ edito │ agrégateur │ 10 │
│ 4 │ edito │ agence │ 1 │
└───┴───────┴────────────┴───────┘
```
### 打印直方图
```
xan frequency -s edito medias.csv | xan hist
```
```
Histogram for edito (bars: 5, sum: 478, max: 423):
media |423 88.49%|━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━|
individu | 30 6.28%|━━━╸ |
plateforme | 14 2.93%|━╸ |
agrégateur | 10 2.09%|━╸ |
agence | 1 0.21%|╸ |
```
### 计算描述性统计
```
xan stats -s indegree,edito medias.csv | xan transpose | xan view -I
```
```
Displaying 2 cols from 14 rows of
┌─────────────┬───────────────────┬────────────┐
│ field │ indegree │ edito │
├─────────────┼───────────────────┼────────────┤
│ count │ 463 │ 478 │
│ count_empty │ 15 │ 0 │
│ type │ int │ string │
│ types │ int|empty │ string │
│ sum │ 25987 │ │
│ mean │ 56.12742980561554 │ │
│ variance │ 4234.530197929737 │ │
│ stddev │ 65.07326792108829 │ │
│ min │ 0 │ │
│ max │ 424 │ │
│ lex_first │ 0 │ agence │
│ lex_last │ 99 │ plateforme │
│ min_length │ 0 │ 5 │
│ max_length │ 3 │ 11 │
└─────────────┴───────────────────┴────────────┘
```
### 通过评估表达式来过滤文件
```
xan filter 'batch > 1' medias.csv | xan count
```
```
130
```
要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。
### 通过评估表达式基于其他列创建新列
```
xan map 'fmt("{} ({})", name, foundation_year) as key' medias.csv | xan select key | xan slice -l 10
```
```
key
Acrimed.org (2002)
24matins.fr (2006)
Actumag.info (2013)
2012un-Nouveau-Paradigme.com (2012)
24heuresactu.com (2010)
AgoraVox (2005)
Al-Kanz.org (2008)
Alalumieredunouveaumonde.blogspot.com (2012)
Allodocteurs.fr (2005)
Alterinfo.net (2005)
```
要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。
### 通过评估表达式转换列
```
xan transform name 'split(name, ".") | first | upper' medias.csv | xan select name | xan slice -l 10
```
```
name
ACRIMED
24MATINS
ACTUMAG
2012UN-NOUVEAU-PARADIGME
24HEURESACTU
AGORAVOX
AL-KANZ
ALALUMIEREDUNOUVEAUMONDE
ALLODOCTEURS
ALTERINFO
```
要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。
### 执行自定义聚合
```
xan agg 'sum(indegree) as total_indegree, mean(indegree) as mean_indegree' medias.csv | xan view -I
```
```
Displaying 1 col from 1 rows of
┌────────────────┬───────────────────┐
│ total_indegree │ mean_indegree │
├────────────────┼───────────────────┤
│ 25987 │ 56.12742980561554 │
└────────────────┴───────────────────┘
```
要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。最后,要显示可用的[聚合函数](./docs/moonblade/aggs.md)列表,请运行 `xan help aggs`。
### 对行进行分组并执行分组聚合
```
xan groupby edito 'sum(indegree) as indegree' medias.csv | xan view -I
```
```
Displaying 1 col from 5 rows of
┌────────────┬──────────┐
│ edito │ indegree │
├────────────┼──────────┤
│ agence │ 50 │
│ agrégateur │ 459 │
│ plateforme │ 658 │
│ media │ 24161 │
│ individu │ 659 │
└────────────┴──────────┘
```
要访问表达式语言的[速查表](./docs/moonblade/cheatsheet.md),请运行 `xan help cheatsheet`。要显示可用的[函数](./docs/moonblade/functions.md)的完整列表,请运行 `xan help functions`。最后,要显示可用的[聚合函数](./docs/moonblade/aggs.md)列表,请运行 `xan help aggs`。
## 学习
如果你懂法语,[这里](https://ceres.sorbonne-universite.fr/test_outil_xan/)是我们来自 [CERES](https://ceres.sorbonne-universite.fr/) 的朋友对该工具的快速介绍。
*已记录的使用场景*
* [在终端舒适地进行数据可视化](./docs/cookbook/dataviz.md)
* [合并频率表的三种方法](./docs/cookbook/frequency_tables.md)
* [使用 xan 解析和可视化日期](./docs/cookbook/dates.md)
* [通过 URL 前缀关联文件](./docs/cookbook/urls.md)
要了解 `xan` 能实现哪些功能,请参阅此页面。该页面总结了各种复杂但详细的管道(pipeline),这些管道已由真实用户在现实生活中使用该工具解决了他们的问题:[PIPELINES](./docs/PIPELINES.md)。
## 可用命令
- [**help**](./docs/cmd/help.md):获取有关表达式语言的帮助
*探索与可视化*
- [**count (c)**](./docs/cmd/count.md):统计文件中的行数
- [**headers (h)**](./docs/cmd/headers.md):显示表头名称
- [**view (v)**](./docs/cmd/view.md):以人性化的方式预览 CSV 文件
- [**flatten**](./docs/cmd/flatten.md):显示文件每一行的扁平化版本
- [**hist**](./docs/cmd/hist.md):打印直方图,将 CSV 文件的行作为条形显示
- [**plot**](./docs/cmd/plot.md):绘制散点图或折线图
- [**heatmap**](./docs/cmd/heatmap.md):绘制 CSV 矩阵的热力图
- [**spark**](`(通常在某些 Windows shell 中),这会非常有用。在这种情况下,使用 `-` 作为输出路径也意味着转发到 stdout。这在编写脚本时有时很有用。
### 支持的文件格式
`xan` 能够开箱即用地处理各种类 CSV 数据格式:
- `.csv` 文件将被视为逗号分隔
- `.tsv` 和 `.tab` 文件将被视为制表符分隔
- `.scsv` 和 `.ssv` 文件将被视为分号分隔
- `.psv` 文件将被视为竖线(pipe)分隔
- `.cdx` 文件(一种与网络归档相关的索引文件[格式](https://iipc.github.io/warc-specifications/specifications/cdx-format/cdx-2015/))将被视为空格分隔,并且会丢弃其魔数(magic bytes)
- `.ndjson` 和 `.jsonl` 文件将被视为制表符分隔、无表头、并以空字节(null-byte)引用,因此你可以轻松地将它们与 `xan` 命令结合使用(例如,使用表达式语言来解析或处理 JSON 数据以进行聚合,甚至是并行聚合)。如果你需要对换行符分隔的 JSON 数据进行更彻底的转换,请查看 `xan from -f ndjson` 命令。
- 生物信息学中的 `.vcf` 文件([Variant Call Format](https://en.wikipedia.org/wiki/Variant_Call_Format))已获得开箱即用的支持。它们的表头数据将被剥离,并被视为制表符分隔。
- 生物信息学中的 `.gtf` 和 `.gff2` 文件([Gene Transfert Format](https://en.wikipedia.org/wiki/Gene_transfer_format))已获得开箱即用的支持。它们的表头数据将被剥离,并被视为无表头和制表符分隔。
- 生物信息学中的 `.sam` 文件([Sequence Alignment Map](https://en.wikipedia.org/wiki/SAM_(file_format))已获得开箱即用的支持。它们的表头数据将被剥离,并被视为无表头和制表符分隔。
- 生物信息学中的 `.bed` 文件([Browser Extensible Data](https://en.wikipedia.org/wiki/BED_(file_format))已获得开箱即用的支持。它们的表头数据将被剥离,并被视为无表头和制表符分隔。
请注意,使用无处不在的 `-d, --delimiter` 标志始终可以处理更加奇特的分隔符。
一些附加格式(例如 `.gff`、`.gff3`)也受支持,但必须首先使用 `xan input` 命令进行规范化,因为它们的单元格必须进行修剪,或者包含需要跳过的注释行。
还需注意,处理时总是会从数据中剥离 UTF-8 BOM。
### 压缩文件
`xan` 能够读取 gzip 压缩的文件(具有 `.gz` 扩展名)。在需要进行查找(常数时间反转、并行化等)时,它还能够利用 `.gzi` 索引(通常通过 [`bgzip`](https://www.htslib.org/doc/bgzip.html) 创建)。
`xan` 还能够读取使用 [`Zstdandard`](https://github.com/facebook/zstd) 压缩的文件(具有 `.zst` 扩展名)。
### 关于颜色
某些 `xan` 命令默认会在终端打印 ANSI 颜色,典型的有 `view`、`flatten` 等。
所有这些命令都有一个标准的 `--color=(auto|always|never)` 标志,以便在需要时调整着色行为(请注意,默认情况下,当命令通过管道传递时不会打印颜色)。
它们还遵循与 ANSI 着色相关的典型环境变量,例如 `NO_COLOR`、`CLICOLOR` 和 `CLICOLOR_FORCE`,详见[此处](https://bixense.com/clicolors/)的文档。
另外,请注意,某些 `xan` 命令(尤其是 `xan heatmap` 和 `xan spark`)需要一个能够显示 `truecolor`(24位)ANSI 颜色的终端(至少如果你希望它们能够打印连续的颜色渐变)。
有时你可能需要显式地将 `COLORTERM` 环境变量设置为 `truecolor`,如果你知道你的终端支持它们,但你的 shell 却不知道(例如,有时在使用 `screen`、`tmux` 或 `ssh` 时)。
## 表达式语言参考
- [速查表](./docs/moonblade/cheatsheet.md)
- [函数与操作符的综合列表](./docs/moonblade/functions.md)
- [聚合函数的综合列表](./docs/moonblade/aggs.md)
- [窗口聚合函数的综合列表](./docs/moonblade/window.md)
- [抓取 DSL](./docs/moonblade/scraping.md)
## 新闻
有关该工具演进的信息,欢迎阅读:
1. [更新日志](CHANGELOG.md)
2. [xan 杂志](./docs/XANZINE.md)
3. [路线图](https://github.com/medialab/xan/discussions/910)
另请参阅与该工具相关的博客文章:
* [邪恶工程:在 CSV 文件中随机跳转而不会伤到自己](./docs/blog/csv_base_jumping.md)
## 如何引用?
`xan` 已在 [Zen](https://zenodo.org/) 上发布,编号为 [10.5281/zenodo.15310200](https://doi.org/10.5281/zenodo.15310200)。
你可以像这样引用它:
## 常见问题
### 如何显示垂直条形图?
旋转你的屏幕 ;\)
标签:CSV, Rust, 代码示例, 可视化界面, 数据分析, 文本分析, 网络流量审计, 通知系统