Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
defread_quoted_csv(path: str) -> pd.DataFrame:
"""Handle CSVs with quoted fields containing delimiters."""return pd.read_csv(
path,
quotechar='"',
doublequote=True, # Handle "" as escaped quote
escapechar='\\', # Handle \, as escaped comma
engine='python'
)
# For really messy filesdefread_regex_separated(path: str, pattern: str = r',(?=(?:[^"]*"[^"]*")*[^"]*$)') -> pd.DataFrame:
"""Split on delimiter only outside quotes using regex."""import re
rows = []
withopen(path, 'r') as f:
for line in f:
rows.append(re.split(pattern, line.strip()))
return pd.DataFrame(rows[1:], columns=rows[0])
Header Detection
defdetect_header_row(path: str, max_rows: int = 10) -> int:
"""Find the header row in files with metadata at top."""withopen(path, 'r') as f:
lines = [f.readline() for _ inrange(max_rows)]
delimiter = detect_delimiter(path)
for i, line inenumerate(lines):
parts = line.split(delimiter)
# Header likely has more columns than metadata# and contains text-like valuesiflen(parts) > 2andall(p.strip().replace('_', '').isalnum() for p in parts[:3]):
return i
return0# Default to first rowdefread_with_header_detection(path: str) -> pd.DataFrame:
"""Read CSV, auto-detecting header row."""
header_row = detect_header_row(path)
return pd.read_csv(path, skiprows=header_row)
Date Parsing
definfer_date_columns(df: pd.DataFrame) -> list[str]:
"""Identify columns that look like dates."""
date_cols = []
date_patterns = [
r'\d{4}-\d{2}-\d{2}', # 2024-01-15r'\d{2}/\d{2}/\d{4}', # 01/15/2024r'\d{2}-\d{2}-\d{4}', # 15-01-2024r'\d{4}/\d{2}/\d{2}', # 2024/01/15
]
for col in df.columns:
if df[col].dtype == 'object':
sample = df[col].dropna().head(100)
for pattern in date_patterns:
if sample.str.match(pattern).mean() > 0.8:
date_cols.append(col)
breakreturn date_cols
defparse_dates_flexibly(df: pd.DataFrame, columns: list[str]) -> pd.DataFrame:
"""Parse dates with multiple format attempts."""for col in columns:
try:
df[col] = pd.to_datetime(df[col], infer_datetime_format=True)
except:
# Try common formats explicitlyfor fmt in ['%Y-%m-%d', '%m/%d/%Y', '%d/%m/%Y', '%Y/%m/%d']:
try:
df[col] = pd.to_datetime(df[col], format=fmt)
breakexcept:
continuereturn df
defread_excel_smart(path: str, sheet: str | int = 0) -> pd.DataFrame:
"""Read Excel with common cleanup."""
df = pd.read_excel(
path,
sheet_name=sheet,
engine='openpyxl', # For .xlsx# engine='xlrd', # For .xls
)
# Drop fully empty rows/columns
df = df.dropna(how='all').dropna(axis=1, how='all')
# Reset index after dropping
df = df.reset_index(drop=True)
return df
deflist_excel_sheets(path: str) -> list[str]:
"""List all sheets in an Excel file."""
xl = pd.ExcelFile(path)
return xl.sheet_names
CSV-to-SQL Conversion
Generate CREATE TABLE and load statements from CSV files with type inference.
Type Mapping
Detected Pattern
PostgreSQL
MySQL
SQLite
Integer
INTEGER / BIGINT
INT / BIGINT
INTEGER
Decimal
NUMERIC(p,s)
DECIMAL(p,s)
REAL
Boolean
BOOLEAN
TINYINT(1)
INTEGER
Date
DATE
DATE
TEXT
Timestamp
TIMESTAMP
DATETIME
TEXT
UUID
UUID
CHAR(36)
TEXT
Short text
VARCHAR(n)
VARCHAR(n)
TEXT
Long text
TEXT
TEXT
TEXT
JSON
JSONB
JSON
TEXT
PostgreSQL Output
-- Generated from: orders.csv-- Rows: 50,000 | Columns: 8DROPTABLE IF EXISTS orders CASCADE;
CREATE TABLE orders (
order_id BIGINTPRIMARY KEY,
customer_id BIGINTNOT NULL,
order_date DATENOT NULL,
status VARCHAR(20) NOT NULLCHECK (status IN ('pending', 'shipped', 'delivered')),
total_amount NUMERIC(10, 2) NOT NULLCHECK (total_amount >=0),
shipping_address TEXT,
created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP,
updated_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP
);
CREATE INDEX idx_orders_customer ON orders(customer_id);
CREATE INDEX idx_orders_date ON orders(order_date);
\COPY orders FROM'orders.csv'WITH (FORMAT csv, HEADER true, NULL'');
SELECTCOUNT(*) as loaded_rows FROM orders;
MySQL Output
DROPTABLE IF EXISTS orders;
CREATE TABLE orders (
order_id BIGINTPRIMARY KEY,
customer_id BIGINTNOT NULL,
order_date DATENOT NULL,
status ENUM('pending', 'shipped', 'delivered') NOT NULL,
total_amount DECIMAL(10, 2) NOT NULL,
shipping_address TEXT,
created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP,
updated_at TIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP,
INDEX idx_customer (customer_id),
INDEX idx_date (order_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
LOAD DATA INFILE '/path/to/orders.csv'INTOTABLE orders
FIELDS TERMINATED BY','
ENCLOSED BY'"'
LINES TERMINATED BY'\n'
IGNORE 1ROWS;
SQLite Output
DROPTABLE IF EXISTS orders;
CREATE TABLE orders (
order_id INTEGERPRIMARY KEY,
customer_id INTEGERNOT NULL,
order_date TEXT NOT NULL,
status TEXT NOT NULLCHECK (status IN ('pending', 'shipped', 'delivered')),
total_amount REALNOT NULLCHECK (total_amount >=0),
shipping_address TEXT,
created_at TEXT DEFAULT (datetime('now')),
updated_at TEXT DEFAULT (datetime('now'))
);
CREATE INDEX idx_orders_customer ON orders(customer_id);
CREATE INDEX idx_orders_date ON orders(order_date);
.mode csv
.import --skip 1 orders.csv orders
Python Load Script
import pandas as pd
from sqlalchemy import create_engine
defload_csv_to_db(
csv_path: str,
table_name: str,
connection_string: str,
if_exists: str = 'replace',
chunksize: int = 10000) -> int:
"""Load CSV to database with progress."""
engine = create_engine(connection_string)
total_rows = 0for chunk in pd.read_csv(csv_path, chunksize=chunksize):
chunk.to_sql(
table_name, engine,
if_exists=if_exists if total_rows == 0else'append',
index=False
)
total_rows += len(chunk)
return total_rows
Constraints Detection
Automatically detect and suggest:
Primary Key - Column named 'id', '*_id', 'pk'; 100% unique, no nulls
Foreign Keys - Columns ending in '_id'; reference table inferred from prefix
NOT NULL - Columns with 0% null rate
UNIQUE - Columns with 100% unique values; email, username patterns