mcpField
R
read-file

read-file

github.com/duckdb数据与数据库6131.2k 次安装28 周前更新
代码仓库

关于 read-file

read-file 是用于借助 DuckDB 读取和分析数据文件的技能,通过内联宏选择读取器,并支持本地及远程文件路径。

主要功能

  1. 01使用 DuckDB 读取文件
  2. 02通过多种读取器选择格式
  3. 03支持远程文件协议

适用场景

  1. 01检查陌生的数据文件
  2. 02总结列类型、行数和数据特征

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/duckdb/duckdb-skills --skill read-file

安装后在 Claude Code 中输入/read-file确认已加载。

详细介绍

你将帮助用户使用 DuckDB 读取和分析数据文件。

给定的文件名:$0 问题:${1:-describe the data}

第 1 步 — 读取文件

RESOLVED_PATH 是 $0。如果用户提供的是不含 / 的裸文件名,请先使用 find 将其解析为完整路径。

运行一条 DuckDB 命令,在其中内联定义 read_any 宏并读取文件。

对于远程文件,请在宏之前添加所需的 LOAD/SECRET:

协议添加内容
https:// / http://LOAD httpfs;
s3://LOAD httpfs; CREATE SECRET (TYPE S3, PROVIDER credential_chain);
gs:// / gcs://LOAD httpfs; CREATE SECRET (TYPE GCS, PROVIDER credential_chain);
az:// / azure:// / abfss://LOAD httpfs; LOAD azure; CREATE SECRET (TYPE AZURE, PROVIDER credential_chain);

对于本地文件,无需添加前缀。

duckdb -csv -c "
CREATE OR REPLACE MACRO read_any(file_name) AS TABLE
  WITH json_case AS (FROM read_json_auto(file_name))
     , csv_case AS (FROM read_csv(file_name))
     , parquet_case AS (FROM read_parquet(file_name))
     , avro_case AS (FROM read_avro(file_name))
     , blob_case AS (FROM read_blob(file_name))
     , spatial_case AS (FROM st_read(file_name))
     , excel_case AS (FROM read_xlsx(file_name))
     , sqlite_case AS (FROM sqlite_scan(file_name, (SELECT name FROM sqlite_master(file_name) LIMIT 1)))
     , ipynb_case AS (
         WITH nb AS (FROM read_json_auto(file_name))
         SELECT cell_idx, cell.cell_type,
                array_to_string(cell.source, '') AS source,
                cell.execution_count
         FROM nb, UNNEST(cells) WITH ORDINALITY AS t(cell, cell_idx)
         ORDER BY cell_idx
     )
  FROM query_table(
    CASE
      WHEN file_name ILIKE '%.json' OR file_name ILIKE '%.jsonl' OR file_name ILIKE '%.ndjson' OR file_name ILIKE '%.geojson' OR file_name ILIKE '%.geojsonl' OR file_name ILIKE '%.har' THEN 'json_case'
      WHEN file_name ILIKE '%.csv' OR file_name ILIKE '%.tsv' OR file_name ILIKE '%.tab' OR file_name ILIKE '%.txt' THEN 'csv_case'
      WHEN file_name ILIKE '%.parquet' OR file_name ILIKE '%.pq' THEN 'parquet_case'
      WHEN file_name ILIKE '%.avro' THEN 'avro_case'
      WHEN file_name ILIKE '%.xlsx' OR file_name ILIKE '%.xls' THEN 'excel_case'
      WHEN file_name ILIKE '%.shp' OR file_name ILIKE '%.gpkg' OR file_name ILIKE '%.fgb' OR file_name ILIKE '%.kml' THEN 'spatial_case'
      WHEN file_name ILIKE '%.ipynb' THEN 'ipynb_case'
      WHEN file_name ILIKE '%.db' OR file_name ILIKE '%.sqlite' OR file_name ILIKE '%.sqlite3' THEN 'sqlite_case'
      ELSE 'blob_case'
    END
  );

DESCRIBE FROM read_any('RESOLVED_PATH');
SELECT count(*) AS row_count FROM read_any('RESOLVED_PATH');
FROM read_any('RESOLVED_PATH') LIMIT 20;
"

如果失败:

  • duckdb: command not found → 调用 /duckdb-skills:install-duckdb 并重试。
  • 缺少扩展(例如空间文件、xlsx、sqlite)→ 在宏之前添加 INSTALL spatial; LOAD spatial; 或 INSTALL sqlite_scanner; LOAD sqlite_scanner; 并重试。
  • 读取器错误 / 解析错误 → 改用正确的 read_* 函数,而不是 read_any。

第 2 步 — 回答

根据架构、行数和样例行回答:

${1:-describe the data: summarize column types, row count, and any notable patterns.}

评论

支持 Markdown