JavaScript CSV分析程序库

时间:2011-11-15 23:54:09

标签: javascript windows parsing unix csv

JavaScript 是否有一个不错的 CSV Parser 库?到目前为止,我已经使用了 this that 解决方案。在第一个解决方案中,永远不会将新行创建为新的子数组,代码也会这样说,第二个解决方案对Windows 格式为的文本文件不起作用 <CR><LF>,分别为\r\n

是否足以申请

text = text.replace("\r","");

到Windows CSV文件?这实际上有效,但我认为这有点怪癖。是否有比随机博客解决方案更常见的csv解析器?

4 个答案:

答案 0 :(得分:4)

这是'简单'解决方案

csv.split(/\r\n|\r|\n/g)

它处理:

  • \ n
  • \ r
  • \ r \ n
  • \ n \ r

不幸的是,它打破了在分隔符之间包含换行符的值。

例如,以下行条目......

"this is some","valid CSV data","with a \r\nnewline char"

会破坏它,因为'\ r \ n'会被错误地解释为条目的结尾。

要获得完整的解决方案,最好的办法是创建一个ND-FSM(非确定性有限状态机)词法分析器/解析器。如果您听说过Chomsky Hierarchy,则可以将CSV解析为Type III语法。这意味着使用状态跟踪进行char-by-char或token-by-token处理。

我有一个完全RFC 4180兼容的客户端库可用,但不知何故,我引起了一个删除快乐模式的外部链接的注意。如果您有兴趣,我的个人资料中会有链接;祝你好运。

我会从经验中给你一个公平的警告,表面看起来很简单。在研究了数十/数百个实现之后,我只看到了3个javascript解析器,它们完全符合规范,并且没有一个完全符合RFC。我设法写了一个,但只是在社区的帮助下,还有很多痛苦

答案 1 :(得分:2)

如果您在Node中工作,那么可以处理极其庞大的数据(&gt; GB文件)并支持转义字符的优秀CSV parser

如果您在浏览器JS中工作,您仍然可以从code中提取处理逻辑,以便它对字符串(而不是节点Stream)进行操作。

答案 2 :(得分:2)

这是一种方法:

// based on json_parse from JavaScript The Good Part by D. Crockford
var csv_parse = function () {
    var at,
        ch,
        text,
        error = function (m) {
            throw {
                name: 'SyntaxError',
                message: m,
                at: at,
                text: text  
            };
        },
        next = function (c) {
            if (c && c !== ch) {
                error("Expected '" + c + "' instead of '" + ch + "'");
            }

            ch = text.charAt(at);
            at += 1;
            return ch;
        },
        //needed to handle "" which indicates escaped quote
        peek = function () {
            return text.charAt(at); 
        },
        white = function () {
            while (ch && ch <= ' ' && ch !== '\n') {
                next();
            }
        },
        // if numeric, then return number
        number = function () {
            var number,
                string = word();

            number = +string;
            if (isNaN(number)) {
                return string;
            } else {
                return number;
            }
        },
        word = function () {
            var string = '';
            while (ch !== ',' && ch !== '\n') {
                string += ch;
                next();
            }
            return string;
        },
        // the matching " is the end of word not ,
        // need to worry about "", which is escaped quote
        quoted = function () {
            var string ='';

            if (ch === '"') {
                while (next()) {
                    if (ch === '"') {
                        //print('need to know ending quote or escaped quote');
                        // need to know ending quote or escaped quote ("")
                        if (peek() === '"') {
                            //print('maybe double quote near '+string);
                            next('"');
                            string += ch;
                        } else {
                            next('"')
                            return string;
                        }
                    } else {
                        string += ch;
                    }
                }
                return string;
            }
            error("Bad string");
        },
        value = function () {
            white();

            switch(ch) {
            case '-':
                return number();
            case '"':
                return quoted();
            default:
                return ch >= '0' && ch <= '9' ? number() : word();  
            }

            return number();
        },
        line = function () {
            var array = [];
            white();
            if (ch === '\n') {
                next('\n');
                return array;//empty []
            }
            while (ch) {
                array.push( value() );
                white();
                if (ch === '\n') {
                    next('\n');
                    return array;//got something
                }
                next(',');// not very liberal with delimiter
                white();
            }
        };


  return function (_line) {
    var result;
    text = _line;
    at = 0;
    ch = ' ';
    result = line();
    white();
    if (ch) {
        error("Syntax error");
    }
    return result;
  };
}();

答案 3 :(得分:0)

我的功能很扎实,只需投入使用,希望对您有所帮助。

csvToArray v1.3

紧凑(508字节)但兼容的功能,可将CSV字符串转换为2D数组,符合RFC4180标准。

http://code.google.com/p/csv-to-array/

常用用法:jQuery

 $.ajax({
        url: "test.csv",
        dataType: 'text',
        cache: false
 }).done(function(csvAsString){
        csvAsArray=csvAsString.csvToArray();
 });

常用用法:Javascript

csvAsArray = csvAsString.csvToArray();

覆盖字段分隔符

csvAsArray = csvAsString.csvToArray("|");

覆盖记录分隔符

csvAsArray = csvAsString.csvToArray("", "#");

覆盖跳过标题

csvAsArray = csvAsString.csvToArray("", "", 1);

覆盖所有

csvAsArray = csvAsString.csvToArray("|", "#", 1);