JSFiddle - React, Tailwind, and code Playground

HTML

<script src="http://cloud.github.com/downloads/dmajda/pegjs/peg-0.7.0.js"></script>
<textarea id="test-csv"></textarea><br>
<button id="parse-button">Parse</button>
<pre id="result"></pre>
<pre id="resultObjects"></pre>

CSS

body { padding: 20px; }

textarea {
    width: 600px;
    height: 300px;
}

pre {
    border: 1px solid green;
    padding: 10px;
    margin-top: 20px;
    background-color: #F6F6F6;
}

.error {
    border: 1px solid red;
}

CoffeeScript

csv = """
Year,Make,Model,Description,Price
1997,Ford,E350,"ac, abs, moon",3000.00
1999,Chevy,"Venture ""Extended Edition""\\","",4900.00
1999,Chevy,"Venture ""Extended Edition, Very Large""\","",5000.00
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799.00
1995,Ford,E350,"some ""very"" 'weird
    description' \\here\\",3099.00
"""

$('#test-csv').val csv

`function parseCSV(str) {
    var arr = [];
    var quote = false;
    for (var row = col = c = 0; c < str.length; c++) {
        var cc = str[c], nc = str[c+1];
        arr[row] = arr[row] || [];
        arr[row][col] = arr[row][col] || '';

        if (cc == '"' && quote && nc == '"') { arr[row][col] += cc; ++c; continue; }  
        if (cc == '"') { quote = !quote; continue; }
        if (cc == ',' && !quote) { ++col; continue; }
        if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; }
        if (cc == '\n' && !quote) { ++row; col = 0; continue; }
        if (cc == '\r' && !quote) { ++row; col = 0; continue; }

        arr[row][col] += cc;
    }
    return arr;
}

function parseCSVtoObjects(csvString, /* optional */ columnNames) {
    var csvRows = parseCSV(csvString);

    var firstDataRow = 0;
    if (!columnNames) {
        columnNames = csvRows[0];
        firstDataRow = 1;
    }

    var result = [];
    for (var i = firstDataRow, n = csvRows.length; i < n; i++) {
        var rowObject = {};
        var row = csvRows[i];
        for (var j = 0, m = Math.min(row.length, columnNames.length); j < m; j++) {
            var columnName = columnNames[j];
            var columnValue = row[j];
            rowObject[columnName] = columnValue;
        }
        result.push(rowObject);
    }
    return result;
}
`

$('#parse-button').click ->
    try
        data = parseCSV $('#test-csv').val()
        $('#result').removeClass('error').html formatJSON data
    catch error
        $('#result').addClass('error').html formatJSON error

    try
        data = parseCSVtoObjects...