如何使用JavaScriptparsing包含换行符的CSV数据

给定一个在某些字段中有换行/返回字符的CSV文件,我们如何parsing数据而不将字段分成多行。

CSV数据示例:

ID;Name;Country;ISO-2;Address;Latitude;Longitude 022wje3;Europa;Italy;IT;"Viale Kennedy 3 34073 Grado";"45,67960";"13,40070" 024oua5;Hiberia;Italy;IT;"Via XXIV Maggio 8 00187 Rome";"41,89720";"12,48680" 028gupn;Regal Riverside;Hong Kong;HK;"34-36 Tai Chung Kiu Road Shatin Hong Kong";"22,38260";"114,19600" 02j7qry;Okaliptus Holiday Villas Apart;Turkey;TR;"Sevket Sabanci Caddesi No. 70 Bahçelievler Mevkii Turgutreis";"37,02130";"27,25120" 02pc99z;California Apartementos;Spain;ES;"Prat d'en Carbó 43840 Salou";"41,07620";"1,14667" 02tu1jz;Elvis Presley's Heartbreak;United States;US;"3677 Elvis Presley Blvd. Memphis Tennessee 38116";"35,04850";"-90,02710" 

注意:字段实际上是用分号隔开的; 因为地址可以包含逗号

每行有7个字段,但我们不希望错误地parsing包含换行字符的字段中的数据为多行…

我们在StackOverflow上find了几个关注Perl的答案:

  • 如何在Perl中的字段内使用换行符和逗号分析CSV?
  • 当数据包含换行符时,Text :: CSVparsing

但是我对Perl有点生疏,并没有发现一个JS焦点的答案。

你是否尝试过Ben Nadel的CSVToArray

 /** * CSVToArray parses any String of Data including '\r' '\n' characters, * and returns an array with the rows of data. * @param {String} CSV_string - the CSV string you need to parse * @param {String} delimiter - the delimeter used to separate fields of data * @returns {Array} rows - rows of CSV where first row are column headers */ function CSVToArray (CSV_string, delimiter) { delimiter = (delimiter || ","); // user-supplied delimeter or default comma var pattern = new RegExp( // regular expression to parse the CSV values. ( // Delimiters: "(\\" + delimiter + "|\\r?\\n|\\r|^)" + // Quoted fields. "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" + // Standard fields. "([^\"\\" + delimiter + "\\r\\n]*))" ), "gi" ); var rows = [[]]; // array to hold our data. First row is column headers. // array to hold our individual pattern matching groups: var matches = false; // false if we don't find any matches // Loop until we no longer find a regular expression match while (matches = pattern.exec( CSV_string )) { var matched_delimiter = matches[1]; // Get the matched delimiter // Check if the delimiter has a length (and is not the start of string) // and if it matches field delimiter. If not, it is a row delimiter. if (matched_delimiter.length && matched_delimiter !== delimiter) { // Since this is a new row of data, add an empty row to the array. rows.push( [] ); } var matched_value; // Once we have eliminated the delimiter, check to see // what kind of value was captured (quoted or unquoted): if (matches[2]) { // found quoted value. unescape any double quotes. matched_value = matches[2].replace( new RegExp( "\"\"", "g" ), "\"" ); } else { // found a non-quoted value matched_value = matches[3]; } // Now that we have our value string, let's add // it to the data array. rows[rows.length - 1].push(matched_value); } return rows; // Return the parsed data Array } 

在你的情况下调用它:

 var rows = CSVToArray(CSV_string, ';'); 

CSV_string是您的CSV数据string。