CSV 데이터를 구문 분석하는 Javascript 코드


217

누군가 CSV 데이터를 구문 분석하기 위해 자바 스크립트 코드를 어디에서 찾을 수 있는지에 대한 아이디어가 있습니까?


3
여기이 대답 한 번 봐, 그것은 좋은 답변이 있습니다 stackoverflow.com/questions/8493195/...을
Dobes Vandermeer

14
아래의 답변 대부분은 Andy의 답변을 제외하고 잘못되었습니다. 패턴 일치 또는 분할을 사용하는 모든 답변은 실패 할 것으로 예상되며 이스케이프 시퀀스를 지원하지 않습니다. 이를 위해서는 유한 상태 머신이 필요합니다.
greg.kindel

3
JavaScript와 Papa를 사용하여 로컬 CSV 파일 파싱 구문 분석 : joyofdata.de/blog/…
Raffael

4
Papa Parse 는 많은 기능 (멀티 스레드, 헤더 행 지원, 자동 감지 구분 기호 등)을 갖춘 또 다른 옵션입니다.
Hinrich

1
PapaParse에 대한 또 다른 투표는 AngularJS와 함께 사용하며 훌륭하게 작동합니다.
Dmitry Buslaev 2016 년

답변:


258

이 블로그 항목에서 언급 한 CSVToArray () 함수를 사용할 수 있습니다 .

<script type="text/javascript">
    // ref: http://stackoverflow.com/a/1293163/2343
    // This will parse a delimited string into an array of
    // arrays. The default delimiter is the comma, but this
    // can be overriden in the second argument.
    function CSVToArray( strData, strDelimiter ){
        // Check to see if the delimiter is defined. If not,
        // then default to comma.
        strDelimiter = (strDelimiter || ",");

        // Create a regular expression to parse the CSV values.
        var objPattern = new RegExp(
            (
                // Delimiters.
                "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +

                // Quoted fields.
                "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +

                // Standard fields.
                "([^\"\\" + strDelimiter + "\\r\\n]*))"
            ),
            "gi"
            );


        // Create an array to hold our data. Give the array
        // a default empty first row.
        var arrData = [[]];

        // Create an array to hold our individual pattern
        // matching groups.
        var arrMatches = null;


        // Keep looping over the regular expression matches
        // until we can no longer find a match.
        while (arrMatches = objPattern.exec( strData )){

            // Get the delimiter that was found.
            var strMatchedDelimiter = arrMatches[ 1 ];

            // Check to see if the given delimiter has a length
            // (is not the start of string) and if it matches
            // field delimiter. If id does not, then we know
            // that this delimiter is a row delimiter.
            if (
                strMatchedDelimiter.length &&
                strMatchedDelimiter !== strDelimiter
                ){

                // Since we have reached a new row of data,
                // add an empty row to our data array.
                arrData.push( [] );

            }

            var strMatchedValue;

            // Now that we have our delimiter out of the way,
            // let's check to see which kind of value we
            // captured (quoted or unquoted).
            if (arrMatches[ 2 ]){

                // We found a quoted value. When we capture
                // this value, unescape any double quotes.
                strMatchedValue = arrMatches[ 2 ].replace(
                    new RegExp( "\"\"", "g" ),
                    "\""
                    );

            } else {

                // We found a non-quoted value.
                strMatchedValue = arrMatches[ 3 ];

            }


            // Now that we have our value string, let's add
            // it to the data array.
            arrData[ arrData.length - 1 ].push( strMatchedValue );
        }

        // Return the parsed data.
        return( arrData );
    }

</script>

1
이것은 쉼표, 따옴표 및 줄 바꿈을 처리 할 수 ​​있습니다. 예 : var csv = 'id, value \ n1, James \ n02, "Jimmy Smith, Esq."\ n003, "James" "Jimmy" "Smith, III"\ n0004, "James \ nSmith \ nWuz Here" 'var array = CSVToArray (csv, ",");
프로토 타입

4
인용 된 빈 필드 를 제공 undefined합니다 . 예 : 나에게 제공 하지만 나에게 제공합니다 . CSVToArray("4,,6")[["4","","6"]]CSVToArray("4,\"\",6")[["4",undefined,"6"]]
Pang

3
파이어 폭스에서 이것에 문제가 있었고 스크립트가 응답하지 않았습니다. 너무 그 원인을 찾을 수 없습니다,하지만 소수의 사용자 만 영향을주는 듯
JDandChips

8
정규식에 버그 "([^\"\\"가 있습니다 "([^\\". 그렇지 않으면 따옴표가없는 값의 큰 따옴표가 조기에 종료됩니다. 발견이 어려운 방법 ...
월터 Tross

5
위에서 설명한 정규식 수정 사항이 적용된 위의 방법의 축소 버전을 찾는 사람은 gist.github.com/Jezternz/c8e9fafc2c114e079829974e3764db75
Josh Mc

147

jQuery-CSV

CSV를 Javascript 데이터로 구문 분석하기위한 엔드 투 엔드 솔루션으로 작동하도록 설계된 jquery 플러그인입니다. RFC 4180에 제시된 모든 단일 에지 케이스를 처리합니다. 와 스펙이 누락 된 Excel / Google Spreadsheed 내보내기 (대부분 null 값 포함)에 나타나는 일부를 처리합니다.

예:

트랙, 아티스트, 앨범, 년

위험한, '버스트 라임', '재해가 닥쳤을 때', 1997

// calling this
music = $.csv.toArrays(csv)

// outputs...
[
  ["track","artist","album","year"],
  ["Dangerous","Busta Rhymes","When Disaster Strikes","1997"]
]

console.log(music[1][2]) // outputs: 'When Disaster Strikes'

최신 정보:

네, 아마도 완전히 구성 가능하다고 언급해야합니다.

music = $.csv.toArrays(csv, {
  delimiter:"'", // sets a custom value delimiter character
  separator:';', // sets a custom field separator character
});

업데이트 2 :

이제 Node.js의 jQuery 와도 작동합니다. 따라서 동일한 lib로 클라이언트 측 또는 서버 측 구문 분석을 수행 할 수 있습니다.

업데이트 3 :

Google 코드가 종료 된 이후 jquery-csv가 GitHub로 마이그레이션되었습니다 .

면책 조항 : 나는 또한 jQuery-CSV의 저자입니다.


29
왜 jQuery CSV입니까? 왜 jQuery에 의존합니까? 소스를 빠르게 살펴 보았습니다. jQuery를 사용하는 것 같지 않습니다
paulslater19

17
@ paulslater19 플러그인은 jquery에 의존하지 않습니다. 오히려 일반적인 jQuery 개발 지침을 따릅니다. 포함 된 모든 메소드는 정적이며 자체 네임 스페이스 (예 : $ .csv)에 있습니다. jQuery없이 사용하려면 초기화 중에 플러그인이 바인딩 할 전역 $ 객체를 만들면됩니다.
Evan Plaice

2
csv해결책 코드는 참조 .csv filename? csv 파일을 구문 분석하는 좋은 JS / JQuery 도구에 관심이 있습니다
bouncingHippo

1
@bouncingHippo이 예에서는 csv 데이터 문자열을 참조하지만 HTML5 파일 API를 사용하여 브라우저에서 로컬로 csv 파일을 여는 데 lib를 사용할 수 있습니다. 다음은 jquery-csv.googlecode.com/git/examples/file-handling.html 작업의 예입니다 .
Evan Plaice

1
jQuery에 의존하지 않기 때문에 전역 "$"의존성을 제거하고 사용자가 원하는 객체 참조를 전달하도록하는 것이 좋습니다. 사용 가능한 경우 기본적으로 jQuery를 사용합니다. "$"를 사용하는 다른 라이브러리가 있으며 해당 라이브러리의 프록시가 최소한 인 개발 팀에서 사용할 수 있습니다.
RobG

40

나는이 구현 스프레드 시트 프로젝트의 일환으로합니다.

이 코드는 아직 철저히 테스트되지는 않았지만 누구나 사용할 수 있습니다.

그러나 일부 답변에서 언급했듯이 실제로 DSV 또는 TSV 파일 이 있으면 값에서 레코드 및 필드 구분 기호를 사용할 수 없으므로 구현이 훨씬 간단해질 수 있습니다 . 반면에 CSV는 실제로 필드 내에 쉼표와 줄 바꿈이있을 수 있으므로 대부분의 정규식 및 분할 기반 접근 방식을 위반합니다.

var CSV = {
parse: function(csv, reviver) {
    reviver = reviver || function(r, c, v) { return v; };
    var chars = csv.split(''), c = 0, cc = chars.length, start, end, table = [], row;
    while (c < cc) {
        table.push(row = []);
        while (c < cc && '\r' !== chars[c] && '\n' !== chars[c]) {
            start = end = c;
            if ('"' === chars[c]){
                start = end = ++c;
                while (c < cc) {
                    if ('"' === chars[c]) {
                        if ('"' !== chars[c+1]) { break; }
                        else { chars[++c] = ''; } // unescape ""
                    }
                    end = ++c;
                }
                if ('"' === chars[c]) { ++c; }
                while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ',' !== chars[c]) { ++c; }
            } else {
                while (c < cc && '\r' !== chars[c] && '\n' !== chars[c] && ',' !== chars[c]) { end = ++c; }
            }
            row.push(reviver(table.length-1, row.length, chars.slice(start, end).join('')));
            if (',' === chars[c]) { ++c; }
        }
        if ('\r' === chars[c]) { ++c; }
        if ('\n' === chars[c]) { ++c; }
    }
    return table;
},

stringify: function(table, replacer) {
    replacer = replacer || function(r, c, v) { return v; };
    var csv = '', c, cc, r, rr = table.length, cell;
    for (r = 0; r < rr; ++r) {
        if (r) { csv += '\r\n'; }
        for (c = 0, cc = table[r].length; c < cc; ++c) {
            if (c) { csv += ','; }
            cell = replacer(r, c, table[r][c]);
            if (/[,\r\n"]/.test(cell)) { cell = '"' + cell.replace(/"/g, '""') + '"'; }
            csv += (cell || 0 === cell) ? cell : '';
        }
    }
    return csv;
}
};

9
이것은 내가 가장 좋아하는 답변 중 하나입니다. 많은 코드로 구현되지 않은 실제 파서입니다.
Trevor Dixon

1
줄 끝에 쉼표를 넣으면 빈 셀이 뒤에옵니다. 이 코드는 다음 줄로 건너 뛰어 undefined셀을 만듭니다. 예를 들면 다음과 같습니다.console.log(CSV.parse("first,last,age\r\njohn,doe,"));
skibulk

또한 빈 셀은 빈 문자열로 구문 분석해야합니다. 이 코드는 그것들을 0으로 파싱하는데, 이는 셀이 실제로 0을 포함 할 수 있기 때문에 혼동됩니다 :console.log(CSV.parse("0,,2,3"));
skibulk

@skibulk 두 번째 주석이 잘못되었습니다 (적어도 Chrome에서는 예제와 잘 작동 함). 첫 번째 코멘트는 쉽게 고칠 수 있지만 유효합니다-바로 다음을 추가하십시오 if ('\r' === chars[c]) { ... }:if (end === c-1) { row.push(reviver(table.length-1, row.length, '')); }
coderforlife

35

다음은 쉼표, 줄 바꿈 및 이스케이프 된 큰 따옴표로 인용 된 필드를 처리하는 매우 간단한 CSV 파서입니다. 분할 또는 RegEx가 없습니다. 입력 문자열을 한 번에 1-2 자씩 스캔하고 배열을 만듭니다.

http://jsfiddle.net/vHKYH/ 에서 테스트하십시오 .

function parseCSV(str) {
    var arr = [];
    var quote = false;  // true means we're inside a quoted field

    // iterate over each character, keep track of current row and column (of the returned array)
    for (var row = 0, col = 0, c = 0; c < str.length; c++) {
        var cc = str[c], nc = str[c+1];        // current character, next character
        arr[row] = arr[row] || [];             // create a new row if necessary
        arr[row][col] = arr[row][col] || '';   // create a new column (start with empty string) if necessary

        // If the current character is a quotation mark, and we're inside a
        // quoted field, and the next character is also a quotation mark,
        // add a quotation mark to the current column and skip the next character
        if (cc == '"' && quote && nc == '"') { arr[row][col] += cc; ++c; continue; }  

        // If it's just one quotation mark, begin/end quoted field
        if (cc == '"') { quote = !quote; continue; }

        // If it's a comma and we're not in a quoted field, move on to the next column
        if (cc == ',' && !quote) { ++col; continue; }

        // If it's a newline (CRLF) and we're not in a quoted field, skip the next character
        // and move on to the next row and move to column 0 of that new row
        if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; }

        // If it's a newline (LF or CR) and we're not in a quoted field,
        // move on to the next row and move to column 0 of that new row
        if (cc == '\n' && !quote) { ++row; col = 0; continue; }
        if (cc == '\r' && !quote) { ++row; col = 0; continue; }

        // Otherwise, append the current character to the current column
        arr[row][col] += cc;
    }
    return arr;
}

그것의 간단하고 그것은 나를 위해 작동, 내가 변경 한 유일한 것은 값에 trim ()을 추가하는 것입니다 :)
JustEngland

3
이것은 더 깨끗하고 더 직설적입니다. 4MB 파일을 구문 분석해야했고 다른 답변이 ie8에서 충돌했습니다. 그러나 이것이 관리했습니다.
Charles Clayton

3
이것은 또한 나를 위해 일했습니다. 줄 바꿈을 올바르게 처리 할 수 ​​있도록 수정해야했습니다.if (cc == '\r' && nc == '\n' && !quote) { ++row; col = 0; ++c; continue; } if (cc == '\n' && !quote) { ++row; col = 0; continue; }
user655063

1
다른 사용자 (@ 소린-postelnicu)는 유용하게 사전 객체로 결과를 설정하는 동반자 기능을 발표 : jsfiddle.net/8t2po6wh를 .
Trevor Dixon

1
예, 속도가 필요하거나 메모리 공간이 중요한 경우에는 이와 같은 깨끗한 솔루션이 훨씬 뛰어납니다. 상태 머신과 같은 구문 분석이 훨씬 매끄 럽습니다.
5

14

다음은 RFC 4180에서 잘 작동하는 것처럼 보이는 PEG (.js) 문법입니다 (예 : http://en.wikipedia.org/wiki/Comma-separated_values 의 예제를 처리 함 ).

start
  = [\n\r]* first:line rest:([\n\r]+ data:line { return data; })* [\n\r]* { rest.unshift(first); return rest; }

line
  = first:field rest:("," text:field { return text; })*
    & { return !!first || rest.length; } // ignore blank lines
    { rest.unshift(first); return rest; }

field
  = '"' text:char* '"' { return text.join(''); }
  / text:[^\n\r,]* { return text.join(''); }

char
  = '"' '"' { return '"'; }
  / [^"]

http://jsfiddle.net/knvzk/10 또는 http://pegjs.majda.cz/online 에서 사용해보십시오 . https://gist.github.com/3362830 에서 생성 된 구문 분석기를 다운로드 하십시오 .


2
못? Type III 문법을 위해 AST를 약간의 메모리로 구축하지 않습니다. 줄 바꿈 문자가 포함 된 필드를 처리 할 수 ​​있습니까? '일반 문법'구문 분석기에서 다루기가 가장 어렵 기 때문입니다. 어느 쪽이든, 새로운 접근 방식은 +1입니다.
Evan Plaice

1
예, 필드 내부의 개행을 처리합니다.
Trevor Dixon

2
좋았어. 그것만으로도 내가 본 모든 구현의 95 %보다 낫다. 전체 RFC 준수 여부를 확인하려면 여기에서 테스트를 살펴보십시오 ( jquery-csv.googlecode.com/git/test/test.html ).
Evan Plaice

6
잘했다. PEG를 켜면 +1입니다. 나는 파서 생성기를 좋아한다. "5 년 동안 인생을 자동화하는 데 5 년을 소비 할 수있는 프로그램은 왜 수동으로 진행합니까?"
-Terence

14

csvToArray v1.3

RFC4180 표준을 준수하는 CSV 문자열을 2D 배열로 변환하는 소형 (645 바이트) 호환 기능.

https://code.google.com/archive/p/csv-to-array/downloads

일반적인 사용법 : 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);

흥미로운 것 같지만 지금 코드를 찾을 수 없습니다. 다시 게시 할 수 있습니까?
Sam Watkins

1
기본 링크를 현재 링크로 업데이트했습니다. 많은 감사합니다.
dt192

3

내가 왜 전 kirtans 수 없습니다 모르겠어요. 나를 위해 일하기 위해. 빈 필드 또는 후행 쉼표가있는 필드에서 실패한 것 같습니다 ...

이것은 둘 다 처리하는 것 같습니다.

파서 코드를 작성하지 않고 파서 함수 주위를 래퍼로 작성하여 파일 작업을 수행했습니다. 기여 참조

    var Strings = {
        /**
         * Wrapped csv line parser
         * @param s string delimited csv string
         * @param sep separator override
         * @attribution : http://www.greywyvern.com/?post=258 (comments closed on blog :( )
         */
        parseCSV : function(s,sep) {
            // http://stackoverflow.com/questions/1155678/javascript-string-newline-character
            var universalNewline = /\r\n|\r|\n/g;
            var a = s.split(universalNewline);
            for(var i in a){
                for (var f = a[i].split(sep = sep || ","), x = f.length - 1, tl; x >= 0; x--) {
                    if (f[x].replace(/"\s+$/, '"').charAt(f[x].length - 1) == '"') {
                        if ((tl = f[x].replace(/^\s+"/, '"')).length > 1 && tl.charAt(0) == '"') {
                            f[x] = f[x].replace(/^\s*"|"\s*$/g, '').replace(/""/g, '"');
                          } else if (x) {
                        f.splice(x - 1, 2, [f[x - 1], f[x]].join(sep));
                      } else f = f.shift().split(sep).concat(f);
                    } else f[x].replace(/""/g, '"');
                  } a[i] = f;
        }
        return a;
        }
    }

1

구조에 규칙적인 표현! 이 몇 줄의 코드는 RFC 4180 표준에 따라 쉼표, 따옴표 및 줄 바꿈이 포함 된 올바르게 인용 된 필드를 처리합니다.

function parseCsv(data, fieldSep, newLine) {
    fieldSep = fieldSep || ',';
    newLine = newLine || '\n';
    var nSep = '\x1D';
    var qSep = '\x1E';
    var cSep = '\x1F';
    var nSepRe = new RegExp(nSep, 'g');
    var qSepRe = new RegExp(qSep, 'g');
    var cSepRe = new RegExp(cSep, 'g');
    var fieldRe = new RegExp('(?<=(^|[' + fieldSep + '\\n]))"(|[\\s\\S]+?(?<![^"]"))"(?=($|[' + fieldSep + '\\n]))', 'g');
    var grid = [];
    data.replace(/\r/g, '').replace(/\n+$/, '').replace(fieldRe, function(match, p1, p2) {
        return p2.replace(/\n/g, nSep).replace(/""/g, qSep).replace(/,/g, cSep);
    }).split(/\n/).forEach(function(line) {
        var row = line.split(fieldSep).map(function(cell) {
            return cell.replace(nSepRe, newLine).replace(qSepRe, '"').replace(cSepRe, ',');
        });
        grid.push(row);
    });
    return grid;
}

const csv = 'A1,B1,C1\n"A ""2""","B, 2","C\n2"';
const separator = ',';      // field separator, default: ','
const newline = ' <br /> '; // newline representation in case a field contains newlines, default: '\n' 
var grid = parseCsv(csv, separator, newline);
// expected: [ [ 'A1', 'B1', 'C1' ], [ 'A "2"', 'B, 2', 'C <br /> 2' ] ]

lex / yacc와 같은 파서 생성기가 필요하지 않습니다. 정규 표현식은 긍정적 인 lookbehind, 부정적인 lookbehind 및 긍정적 인 lookahead 덕분에 RFC 4180을 올바르게 처리합니다.

https://github.com/peterthoeny/parse-csv-js의 복제 / 다운로드 코드


정규식은 유한 상태 머신을 사용하여 구현되므로 실제로 FSM이 필요합니다.
Henry Henrinson

@HenryHenrinson : 반드시 그런 것은 아닙니다. 위의 코드에서 문제를 찾도록 요청합니다. 나는 생산에 사용합니다. 정규 표현식으로 더 복잡한 구문 분석을 수행 할 수도 있습니다. 구문 트리를 작성하기 위해 LL 구문 분석기가 필요하지 않습니다. 블로그는 다음과 같습니다. 정규 표현식을 사용하여 중첩 구조 구문 분석 방법, twiki.org/cgi-bin/view/Blog/BlogEntry201109x3
Peter Thoeny

@HenryHenrinson : 아, 네, 저를 맹세합니다. 우리는 폭력적으로 동의하고 있습니다 :-)
Peter Thoeny

-1

이 자바 스크립트 스크립트를 구성하여 문자열의 CSV를 배열 객체로 구문 분석했습니다. 전체 CSV를 줄, 필드로 나누고 그에 따라 처리하는 것이 좋습니다. 필요에 맞게 코드를 쉽게 변경할 수 있다고 생각합니다.

도움이 되길 바랍니다. 감사.

    //
    //
    // CSV to object
    //
    //

    const new_line_char = '\n';
    const field_separator_char = ',';

    function parse_csv(csv_str) {

        var result = [];

        let line_end_index_moved = false;
        let line_start_index = 0;
        let line_end_index = 0;
        let csr_index = 0;
        let cursor_val = csv_str[csr_index];
        let found_new_line_char = get_new_line_char(csv_str);
        let in_quote = false;

        // handle \r\n
        if (found_new_line_char == '\r\n') {
            csv_str = csv_str.split(found_new_line_char).join(new_line_char);
        }
        // handle last char is not \n
        if (csv_str[csv_str.length - 1] !== new_line_char) {
            csv_str += new_line_char;
        }

        while (csr_index < csv_str.length) {
            if (cursor_val === '"') {
                in_quote = !in_quote;
            } else if (cursor_val === new_line_char) {
                if (in_quote === false) {
                    if (line_end_index_moved && (line_start_index <= line_end_index)) {
                        result.push(parse_csv_line(csv_str.substring(line_start_index, line_end_index)));
                        line_start_index = csr_index + 1;
                    } // else: just ignore line_end_index has not moved or line has not been sliced for parsing the line
                } // else: just ignore because we are in quote
            }
            csr_index++;
            cursor_val = csv_str[csr_index];
            line_end_index = csr_index;
            line_end_index_moved = true;
        }

        // handle \r\n
        if (found_new_line_char == '\r\n') {
            let new_result = [];
            let curr_row;
            for (var i = 0; i < result.length; i++) {
                curr_row = [];
                for (var j = 0; j < result[i].length; j++) {
                    curr_row.push(result[i][j].split(new_line_char).join('\r\n'));
                }
                new_result.push(curr_row);
            }
            result = new_result;
        }

        return result;
    }

    function parse_csv_line(csv_line_str) {

        var result = [];

        // let field_end_index_moved = false;
        let field_start_index = 0;
        let field_end_index = 0;
        let csr_index = 0;
        let cursor_val = csv_line_str[csr_index];
        let in_quote = false;

        // Pretend that the last char is the separator_char to complete the loop
        csv_line_str += field_separator_char;

        while (csr_index < csv_line_str.length) {
            if (cursor_val === '"') {
                in_quote = !in_quote;
            } else if (cursor_val === field_separator_char) {
                if (in_quote === false) {
                    if (field_start_index <= field_end_index) {
                        result.push(parse_csv_field(csv_line_str.substring(field_start_index, field_end_index)));
                        field_start_index = csr_index + 1;
                    } // else: just ignore field_end_index has not moved or field has not been sliced for parsing the field
                } // else: just ignore because we are in quote
            }
            csr_index++;
            cursor_val = csv_line_str[csr_index];
            field_end_index = csr_index;
            field_end_index_moved = true;
        }

        return result;
    }

    function parse_csv_field(csv_field_str) {
        with_quote = (csv_field_str[0] === '"');

        if (with_quote) {
            csv_field_str = csv_field_str.substring(1, csv_field_str.length - 1); // remove the start and end quotes
            csv_field_str = csv_field_str.split('""').join('"'); // handle double quotes
        }

        return csv_field_str;
    }

    // initial method: check the first newline character only
    function get_new_line_char(csv_str) {
        if (csv_str.indexOf('\r\n') > -1) {
            return '\r\n';
        } else {
            return '\n'
        }
    }

-3

왜 .split ( ',')을 사용하지 않습니까?

http://www.w3schools.com/jsref/jsref_split.asp

var str="How are you doing today?";
var n=str.split(" "); 

2
이것이 왜 나쁜 대답입니까? 네이티브이며 문자열 내용을 실행 가능한 배열에 배치합니다.
Micah

20
많은 이유가 있습니다. 첫째, 구분 된 값에서 큰 따옴표를 제거하지 않습니다. 라인 분할을 처리하지 않습니다. 구분 된 값에 사용 된 큰 따옴표를 이스케이프하는 데 사용되는 큰 따옴표를 이스케이프하지 않습니다. 빈 값을 허용하지 않습니다. 등 ... CSV 형식의 유연성으로 인해 사용하기가 쉽지만 구문 분석이 어렵습니다. 나는 이것을 downvote하지 않고 경쟁 답변을 downvote하지 않기 때문에.
Evan Plaice

1
줄 바꿈 문자가 포함 된 값을 발견하면 어떻습니까? 간단한 split 함수는 항목을 건너 뛰지 않고 항목의 끝으로 잘못 해석합니다. CSV 구문 분석은 2 개의 분할 루틴을 제공하는 것 (개행 용, 구분 자용)보다 훨씬 더 복잡합니다.
Evan Plaice

2
(cont) 또한 null 값 (a, null ,, value)으로 분할하면 아무것도 반환하지 않지만 빈 문자열을 반환해야합니다. 수신 데이터가 파서를 깰 수는 없지만 RFC 4801 호환 데이터를 처리 할 수있는 강력한 파서를 만드는 것이 100 % 긍정적이라면 스플릿은 좋은 출발입니다.
Evan Plaice

8
에반, 당신의 자바 스크립트 라이브러리가 훌륭하다고 생각합니다. 그러나 여기 또 다른 관점이 있습니다. 나는 일련의 숫자를 매우 예측 가능한 방식으로 저장하기 때문에이 답변에 감사드립니다. 큰 (잘 작성되고 테스트 된) 라이브러리를 포함하는 것보다 가능한 한 브라우저 간 Javascript 호환성과 유지 관리 성을 가능한 한 미래에 확보하는 것이 훨씬 더 중요합니다. 필요에 따라 다른 접근 방식이 필요합니다. 실제 CSV 기능이 필요한 경우 라이브러리 사용을 확실히 약속합니다! :-)
moodboom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.