code icon Code

Parse CSV

Parse CSV with advanced options (headers, delimiters, encoding)

Source Code

import fs from "fs";
import path from "path";
import Papa from "papaparse";

const [inputPath, outputPath, hasHeaders = "true", delimiter = ""] = process.argv.slice(2);

if (!inputPath || !outputPath) {
  console.error("Usage: inputPath outputPath [hasHeaders] [delimiter]");
  process.exit(1);
}

try {
  console.log(`Reading CSV: ${inputPath}...`);
  const csvContent = fs.readFileSync(inputPath, "utf-8");

  const parseConfig = {
    header: hasHeaders === "true",
    skipEmptyLines: true,
    dynamicTyping: true,
  };

  if (delimiter) {
    parseConfig.delimiter = delimiter;
  }

  const result = Papa.parse(csvContent, parseConfig);

  if (result.errors.length > 0) {
    console.log(`  Warnings: ${result.errors.length} parsing issues`);
    for (const err of result.errors.slice(0, 5)) {
      console.log(`    - Row ${err.row}: ${err.message}`);
    }
  }

  // Ensure output directory exists
  const dir = path.dirname(outputPath);
  if (dir && dir !== ".") {
    fs.mkdirSync(dir, { recursive: true });
  }

  fs.writeFileSync(outputPath, JSON.stringify(result.data, null, 2));

  const fields = hasHeaders === "true" && result.meta.fields ? result.meta.fields : [];

  console.log(`\nāœ“ Parsed CSV`);
  console.log(`  Rows: ${result.data.length}`);
  if (fields.length > 0) {
    console.log(`  Fields: ${fields.join(", ")}`);
  }
  console.log(`  Delimiter: ${result.meta.delimiter}`);
  console.log(`  Written to: ${outputPath}`);

  console.log(
    JSON.stringify({
      success: true,
      inputPath,
      outputPath,
      rows: result.data.length,
      fields,
      delimiter: result.meta.delimiter,
    })
  );
} catch (error) {
  console.error("Error:", error.message);
  process.exit(1);
}