用途
convert-file 是一个基于 DuckDB 的数据文件格式转换技能,用于把输入数据文件从一种格式转换为另一种格式。当用户表达“转换为 parquet”“另存为 xlsx”“导出为……”等意图时使用。
主要能力
支持的目标格式及对应处理方式:
- .parquet、.pq:默认格式,无需额外子句
- .csv:FORMAT csv, HEADER
- .tsv:FORMAT csv, HEADER, DELIMITER '\t'
- .json:FORMAT json, ARRAY true
- .jsonl、.ndjson:FORMAT json, ARRAY false
- .xlsx:FORMAT xlsx,需要 INSTALL excel; LOAD excel;
- .geojson:FORMAT GDAL, DRIVER 'GeoJSON',需要 LOAD spatial;
- .gpkg:FORMAT GDAL, DRIVER 'GPKG',需要 LOAD spatial;
- .shp:FORMAT GDAL, DRIVER 'ESRI Shapefile',需要 LOAD spatial;
支持远程输入(s3://、gs://、gcs://、https://、http://),并按协议加载相应扩展与密钥。支持分区输出(PARTITION_BY (col),仅适用于 Parquet 和 CSV 输出)以及 Parquet 压缩(CODEC 'zstd')。
使用方式
第一步,解析输入与输出。输入为 $0;若为不带 / 的裸文件名,则用 find "$PWD" -name "$0" -not -path '/.git/' 2>/dev/null | head -1 解析为完整路径。输出为 $1;若未提供,则默认使用与输入相同的文件名主干加 .parquet 扩展名(例如 data.csv → data.parquet)。根据输出文件扩展名推断目标格式。
第二步,执行转换。运行单条 DuckDB 命令,并根据输入和输出格式按需前置扩展加载:
duckdb -c " <EXTENSION_LOADS> COPY (FROM '<INPUT_PATH>') TO '<OUTPUT_PATH>' <FORMAT_CLAUSE>; "
远程输入需前置协议设置:
- s3://:LOAD httpfs; CREATE SECRET (TYPE S3, PROVIDER credential_chain);
- gs:// / gcs://:LOAD httpfs; CREATE SECRET (TYPE GCS, PROVIDER credential_chain);
- https:// / http://:LOAD httpfs;
若用户提到分区(如“partition by year”),在格式子句中添加 PARTITION_BY (col),仅适用于 Parquet 和 CSV 输出。若用户提到压缩(如“use zstd”),为 Parquet 输出添加 CODEC 'zstd'。
第三步,报告结果。成功时报告:输入文件及检测到的格式;输出文件、格式和大小(ls -lh);若易于计算则报告行数。失败时:若提示 duckdb: command not found,则转交 /duckdb-skills:install-duckdb;若缺少扩展,则安装后重试;若输入解析错误,建议用户检查输入格式,或先尝试 /duckdb-skills:read-file 检查文件。
适用场景
适用于需要在常见数据格式之间快速转换的场合,包括本地文件与远程对象存储文件,以及需要分区或压缩输出的 Parquet/CSV 场景。
限制
分区输出仅支持 Parquet 和 CSV。Excel、GeoJSON、GPKG、Shapefile 等格式需要相应扩展(excel、spatial)。远程输入需要按协议加载 httpfs 并配置密钥。若未提供输出路径,默认输出为 Parquet 格式。