read-file — скилл для Claude Code: читает файл данных через DuckDB
Открывает CSV, Parquet, Excel, SQLite или файл по S3 и HTTPS, показывает схему и первые строки. Пригодится, когда в проекте лежит датасет и надо быстро понять, что внутри.
npx skills add duckdb/duckdb-skills --skill read-file -a claude-codeЧто делает read-file
Скилл вызывается с путём к файлу или ссылкой: $0 — это имя файла, а ${1:-describe the data} — ваш вопрос. Если указано голое имя без слэша, агент сначала ищет полный путь через find, потом одним запросом создаёт макрос read_any и прогоняет по нему три команды в duckdb: DESCRIBE, подсчёт строк, выборка первых 20 записей.
Читатель выбирается по расширению. JSON и JSONL идут через read_json_auto, CSV и TSV — через read_csv, есть ветки для Parquet, Avro, read_xlsx, st_read для пространственных форматов и sqlite_scan для баз. Ноутбуки .ipynb разбираются отдельно: достаются тип ячейки, её исходник и счётчик выполнения. Всё, что не подошло, попадает в ветку с read_blob.
Для удалённых файлов перед макросом надо подгрузить расширение httpfs, а для s3://, gs:// и az:// ещё и создать секрет с credential_chain. Без установленного duckdb в PATH скилл упадёт на первом шаге: в этом случае он передаёт управление /duckdb-skills:install-duckdb. Отсутствующие расширения вроде spatial или sqlite_scanner ставятся флагами INSTALL и LOAD перед вызовом. Исходники на языках программирования скилл не разбирает — для этого есть другие инструменты.
Какие задачи решает
- посмотреть схему и число строк в чужом датасете
- открыть Parquet без установки отдельной библиотеки
- глянуть, что лежит в Excel-выгрузке или SQLite-базе
- прочитать файл данных прямо из S3 или по ссылке HTTPS
- просмотреть содержимое ячеек ноутбука в текстовом виде
Примеры запросов агенту
- Прочитай
orders.parquetи скажи, какие там колонки и сколько записей - Что лежит в
report.xlsx? Опиши типы полей - Открой
s3://bucket/events.jsonlи покажи первые строки
Как установить read-file
1Через Skills CLI (Vercel)
npx skills add duckdb/duckdb-skills --skill read-file -a claude-code2Вручную: положить файлы
~/.claude/skills/read-file/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/read-file/
1Через Skills CLI (Vercel)
npx skills add duckdb/duckdb-skills --skill read-file -a codex2Вручную: положить файлы
.agents/skills/read-file/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add duckdb/duckdb-skills --skill read-file -a cursor2Вручную: положить файлы
.cursor/skills/read-file/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install duckdb/duckdb-skills read-file2Вручную: положить файлы
.github/skills/read-file/SKILL.md1Через Skills CLI (Vercel)
npx skills add duckdb/duckdb-skills --skill read-file -a gemini-cli2Командой платформы
gemini skills install https://github.com/duckdb/duckdb-skills --path skills/read-fileВручную: положить файлы
.devin/skills/read-file/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add duckdb/duckdb-skills --skill read-file -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о read-file
Как установить read-file в Claude Code?
Выполните npx skills add duckdb/duckdb-skills --skill read-file -a claude-code, затем проверьте, что появился файл ~/.claude/skills/read-file/SKILL.md.
Что делает read-file?
Создаёт в DuckDB макрос, который по расширению выбирает нужный ридер, и отвечает на вопрос о данных по схеме, количеству строк и первым записям.
Какие форматы он понимает?
CSV, TSV, JSON и JSONL, Parquet, Avro, Excel, пространственные форматы, SQLite и ноутбуки .ipynb; остальное читается как блоб.
Исходный текст
SKILL.md · MIT
---
name: read-file
description: >
Read any data file (CSV, JSON, Parquet, Avro, Excel, spatial, SQLite) or remote URL (S3, HTTPS).
Use when user references a data file, asks "what's in this file", or wants to preview/profile a dataset.
Not for source code.
argument-hint: <filename or URL> [question about the data]
allowed-tools: Bash
---
You are helping the user read and analyze a data file using DuckDB.
Filename given: `$0`
Question: `${1:-describe the data}`
## Step 1 — Read it
`RESOLVED_PATH` is `$0`. If the user gave a bare filename (no `/`), resolve it to a full path with `find` first.
Run a single DuckDB command that defines the `read_any` macro inline and reads the file.
For **remote files**, prepend the necessary LOAD/SECRET before the macro:
| Protocol | Prepend |
|---|---|
| `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);` |
For **local files**, no prefix needed.
```bash
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;
"
```
**If this fails:**
- **`duckdb: command not found`** → invoke `/duckdb-skills:install-duckdb` and retry.
- **Missing extension** (e.g. spatial files, xlsx, sqlite) → retry with `INSTALL spatial; LOAD spatial;` or `INSTALL sqlite_scanner; LOAD sqlite_scanner;` prepended before the macro.
- **Wrong reader / parse error** → use the correct `read_*` function directly instead of `read_any`.
## Step 2 — Answer
Using the schema, row count, and sample rows, answer:
`${1:-describe the data: summarize column types, row count, and any notable patterns.}`
© duckdb · MIT · duckdb/duckdb-skills