# CSV Import Guide This guide explains how to import your CSV files (OptionsFlow.csv, OptionsVolume.csv, OptionsOpenInterest.csv) into the database. ## Prerequisites 1. **Install dependencies:** ```bash cd backend npm install ``` 2. **Ensure database connection is configured:** - Your `.env` file should have `DATABASE_URL` or Supabase credentials - See `SETUP_ENV.md` for configuration details 3. **Place CSV files in project root:** - `OptionsFlow.csv` - `OptionsVolume.csv` - `OptionsOpenInterest.csv` ## Import Process ### Option 1: Command Line (Recommended) Run the import script: ```bash cd backend npm run import-csv ``` This will: - ✅ Read all three CSV files - ✅ Create tables if they don't exist - ✅ Import data in batches (1000 records at a time) - ✅ Show progress and summary ### Option 2: Programmatic Import You can also import programmatically: ```javascript import { importOptionsFlow, importOptionsVolume, importOptionsOpenInterest } from './scripts/importCSV.js'; // Import each file await importOptionsFlow('./OptionsFlow.csv'); await importOptionsVolume('./OptionsVolume.csv'); await importOptionsOpenInterest('./OptionsOpenInterest.csv'); ``` ## What Gets Imported ### OptionsFlow.csv → `OptionsFlow_monthly` table Columns imported: - CreatedDate, CreatedTime - Symbol, Type, Volume, Price - Side, CallPut, Strike, Spot - Premium, ExpirationDate - Color, ImpliedVolatility, Dte, ER - StockEtf, Sector, Uoa, Weekly, MktCap, OI **Note:** This matches the table structure expected by your SQL queries. ### OptionsVolume.csv → `OptionsVolume` table Columns imported: - SYMBOL, VOL, C VOL, P VOL - P/C, AVG VOL, RATIO - COI, POI, DCOI, DPOI ### OptionsOpenInterest.csv → `OptionsOpenInterest` table Columns imported: - SYMBOL, EXP, C/P - STRIKE, OI, DOI ## Troubleshooting ### Error: "Database connection failed" 1. Check your `.env` file has correct `DATABASE_URL` 2. Verify database is accessible (not paused/restricted) 3. See `TROUBLESHOOTING.md` for connection issues ### Error: "CSV file not found" 1. Ensure CSV files are in the project root directory (same level as `backend/` folder) 2. Check file names are exactly: `OptionsFlow.csv`, `OptionsVolume.csv`, `OptionsOpenInterest.csv` 3. Verify files are readable (not corrupted) ### Error: "Table already exists" This is normal - the script uses `CREATE TABLE IF NOT EXISTS`, so existing tables won't cause errors. ### Error: "Invalid numeric value" The script automatically cleans numeric values (removes commas, dollar signs, etc.). If you see this error: 1. Check the CSV file for corrupted data 2. Verify numeric columns contain valid numbers 3. Empty values are handled as NULL ### Import is slow - The script imports in batches of 1000 records - Large files may take several minutes - Progress is shown during import ## Data Validation After import, verify the data: ```sql -- Check OptionsFlow_monthly SELECT COUNT(*) FROM "OptionsFlow_monthly"; SELECT "Symbol", COUNT(*) FROM "OptionsFlow_monthly" GROUP BY "Symbol" ORDER BY COUNT(*) DESC LIMIT 10; -- Check OptionsVolume SELECT COUNT(*) FROM "OptionsVolume"; SELECT * FROM "OptionsVolume" LIMIT 10; -- Check OptionsOpenInterest SELECT COUNT(*) FROM "OptionsOpenInterest"; SELECT * FROM "OptionsOpenInterest" LIMIT 10; ``` ## Next Steps After importing: 1. ✅ Verify data counts match CSV file row counts 2. ✅ Test your API endpoints (e.g., `/api/options/flow`) 3. ✅ Check that queries work with the imported data ## Notes - **Data is appended** - Running the import multiple times will add duplicate records - **No deduplication** - If you need to avoid duplicates, truncate tables first: ```sql TRUNCATE TABLE "OptionsFlow_monthly"; TRUNCATE TABLE "OptionsVolume"; TRUNCATE TABLE "OptionsOpenInterest"; ``` - **Large files** - Files with 10,000+ records may take 1-2 minutes to import - **Memory usage** - The script processes data in batches to minimize memory usage