Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"parser": "@typescript-eslint/parser",
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"plugins": ["@typescript-eslint"],
"env": {
"node": true,
"es2020": true
},
"parserOptions": {
"ecmaVersion": 2020,
"sourceType": "module"
},
"rules": {
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/explicit-module-boundary-types": "off"
}
}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -137,3 +137,6 @@ dist
# Vite logs files
vite.config.js.timestamp-*
vite.config.ts.timestamp-*

# Test data
test-data/
18 changes: 18 additions & 0 deletions .npmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Source files
src/

# Tests
**/__tests__/
**/*.test.ts
**/*.spec.ts
test-fixtures/
test-data/

# Config files
tsconfig.json
jest.config.js
.eslintrc.json

# Development files
.git
.gitignore
107 changes: 107 additions & 0 deletions EXAMPLES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# CSV SQL CLI Examples

This file demonstrates various queries you can run with csvsqlcli.

## Using the employees.csv file

### Basic Queries
```bash
# Show all employees
csvsqlcli query test-data/employees.csv "SELECT * FROM employees"

# Select specific columns
csvsqlcli query test-data/employees.csv "SELECT name, salary FROM employees"

# Get file information
csvsqlcli info test-data/employees.csv
```

### Filtering
```bash
# Find employees with salary > 70000
csvsqlcli query test-data/employees.csv "SELECT * FROM employees WHERE salary > 70000"

# Find employees from New York
csvsqlcli query test-data/employees.csv "SELECT * FROM employees WHERE city = 'New York'"

# Find employees younger than 30
csvsqlcli query test-data/employees.csv "SELECT name, age FROM employees WHERE age < 30"
```

### Combining Conditions
```bash
# AND operator
csvsqlcli query test-data/employees.csv "SELECT * FROM employees WHERE age > 25 AND salary < 80000"

# OR operator
csvsqlcli query test-data/employees.csv "SELECT * FROM employees WHERE city = 'Boston' OR city = 'Chicago'"
```

### Pattern Matching
```bash
# Find names starting with 'J'
csvsqlcli query test-data/employees.csv "SELECT * FROM employees WHERE name LIKE 'J%'"

# Find cities containing 'York'
csvsqlcli query test-data/employees.csv "SELECT * FROM employees WHERE city LIKE '%York%'"
```

### Sorting
```bash
# Sort by salary (ascending)
csvsqlcli query test-data/employees.csv "SELECT * FROM employees ORDER BY salary ASC"

# Sort by age (descending)
csvsqlcli query test-data/employees.csv "SELECT * FROM employees ORDER BY age DESC"
```

### Limiting Results
```bash
# Get top 3 highest salaries
csvsqlcli query test-data/employees.csv "SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 3"

# Get 2 youngest employees
csvsqlcli query test-data/employees.csv "SELECT name, age FROM employees ORDER BY age ASC LIMIT 2"
```

### Complex Queries
```bash
# Find high earners not in Seattle, sorted by salary
csvsqlcli query test-data/employees.csv "SELECT name, city, salary FROM employees WHERE salary > 70000 AND city != 'Seattle' ORDER BY salary DESC"
```

### Output Formats
```bash
# JSON format
csvsqlcli query test-data/employees.csv "SELECT name, salary FROM employees" --format json

# CSV format (for piping to another CSV tool)
csvsqlcli query test-data/employees.csv "SELECT name, age FROM employees WHERE age < 35" --format csv

# Table format (default, human-readable)
csvsqlcli query test-data/employees.csv "SELECT * FROM employees" --format table
```

## Using the products.csv file

```bash
# Find electronics under $100
csvsqlcli query test-data/products.csv "SELECT product, price FROM products WHERE category = 'Electronics' AND price < 100"

# Get TechCorp products
csvsqlcli query test-data/products.csv "SELECT * FROM products WHERE supplier LIKE 'Tech%'"

# Top 3 most expensive items
csvsqlcli query test-data/products.csv "SELECT product, category, price FROM products ORDER BY price DESC LIMIT 3"

# Low stock items (< 20 units)
csvsqlcli query test-data/products.csv "SELECT product, stock FROM products WHERE stock < 20 ORDER BY stock ASC"
```

## NPX Usage

You can also run the tool without installation:

```bash
npx csvsqlcli query data.csv "SELECT * FROM data WHERE value > 10"
```
162 changes: 161 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,162 @@
# csvsqlcli
Work on relational databases with CSV files

Query CSV files using SQL syntax from the command line.

## Installation

You can use this tool without installation via `npx`:

```bash
npx csvsqlcli query <file.csv> "<SQL query>"
```

Or install globally:

```bash
npm install -g csvsqlcli
```

## Features

- Execute SQL queries on CSV files
- Support for SELECT, WHERE, ORDER BY, LIMIT clauses
- Multiple output formats: table, JSON, CSV
- Comparison operators: =, !=, <, >, <=, >=
- Logical operators: AND, OR
- Pattern matching with LIKE operator
- Automatic numeric type detection

## Usage

### Query Command

Execute a SQL query on a CSV file:

```bash
csvsqlcli query employees.csv "SELECT * FROM employees"
```

#### Select specific columns:

```bash
csvsqlcli query employees.csv "SELECT name, age FROM employees"
```

#### Filter with WHERE clause:

```bash
csvsqlcli query employees.csv "SELECT * FROM employees WHERE age > 30"
```

#### Sort results:

```bash
csvsqlcli query employees.csv "SELECT * FROM employees ORDER BY salary DESC"
```

#### Combine multiple clauses:

```bash
csvsqlcli query employees.csv "SELECT name, salary FROM employees WHERE salary > 70000 ORDER BY salary DESC LIMIT 5"
```

#### Use different output formats:

```bash
# JSON format
csvsqlcli query employees.csv "SELECT * FROM employees" --format json

# CSV format
csvsqlcli query employees.csv "SELECT * FROM employees" --format csv

# Table format (default)
csvsqlcli query employees.csv "SELECT * FROM employees" --format table
```

### Info Command

Display information about a CSV file:

```bash
csvsqlcli info employees.csv
```

## Supported SQL Features

### SELECT Clause
- `SELECT *` - Select all columns
- `SELECT column1, column2` - Select specific columns

### WHERE Clause
- Comparison operators: `=`, `!=`, `<`, `>`, `<=`, `>=`
- Logical operators: `AND`, `OR`
- Pattern matching: `LIKE` (with `%` wildcard)

Example:
```sql
SELECT * FROM table WHERE age > 25 AND salary < 80000
SELECT * FROM table WHERE name LIKE "J%"
```

### ORDER BY Clause
- `ORDER BY column ASC` - Sort ascending (default)
- `ORDER BY column DESC` - Sort descending

### LIMIT Clause
- `LIMIT n` - Return only first n rows

## Examples

Given a CSV file `employees.csv`:
```csv
name,age,city,salary
John,30,New York,75000
Jane,25,Los Angeles,65000
Bob,35,Chicago,80000
Alice,28,Boston,70000
```

### Query Examples

```bash
# Get all employees from New York
csvsqlcli query employees.csv "SELECT * FROM employees WHERE city = 'New York'"

# Get top 3 highest salaries
csvsqlcli query employees.csv "SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 3"

# Find employees with salary between 65000 and 75000
csvsqlcli query employees.csv "SELECT * FROM employees WHERE salary >= 65000 AND salary <= 75000"

# Get employees whose names start with 'J'
csvsqlcli query employees.csv "SELECT * FROM employees WHERE name LIKE 'J%'"
```

## Development

### Prerequisites
- Node.js >= 16.0.0

### Setup

```bash
# Clone the repository
git clone https://github.com/tarsislimadev/csvsqlcli.git
cd csvsqlcli

# Install dependencies
npm install

# Build the project
npm run build

# Run tests
npm test

# Run linter
npm run lint
```

## License

MIT
23 changes: 23 additions & 0 deletions example.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// Example: Using csvsqlcli as a library in your Node.js application

import { CSVParser, SQLEngine } from 'csvsqlcli';

async function queryCSV() {
// Load CSV file
const parser = new CSVParser('data.csv');
await parser.load();

// Create SQL engine
const engine = new SQLEngine(parser.getData());

// Execute query
const result = engine.execute('SELECT * FROM data WHERE value > 10');

// Process results
console.log(`Found ${result.rowCount} rows`);
result.rows.forEach(row => {
console.log(row);
});
}

queryCSV().catch(console.error);
13 changes: 13 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
roots: ['<rootDir>/src'],
testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'],
collectCoverageFrom: [
'src/**/*.ts',
'!src/**/*.test.ts',
'!src/**/__tests__/**'
],
coverageDirectory: 'coverage',
verbose: true
};
Loading