2016-03-29 14 views
5

Cho tệp CSV có ký tự dòng mới/trả về trong các trường nhất định, làm cách nào để phân tích dữ liệu mà không chia tách trường thành nhiều hàng.Cách phân tích cú pháp dữ liệu CSV có chứa dòng mới trong trường bằng cách sử dụng JavaScript

Ví dụ dữ liệu 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" 

Lưu ý: các lĩnh vực đang thực sự phân cách bằng dấu chấm phẩy ; vì Địa chỉ có thể chứa dấu phẩy

Mỗi hàng có 7 lĩnh vực nhưng chúng tôi không muốn để phân tích nhầm dữ liệu trong một trường chứa các ký tự dòng mới dưới dạng nhiều hàng ...

Chúng tôi tìm thấy một vài câu trả lời Perl-tập trung vào StackOverflow:

nhưng tôi là một chút gỉ trên Perl và đã không phát hiện ra một câu trả lời JS-tập trung.

+1

Dòng mới được bao gồm trong dấu ngoặc kép không phải là phần cuối của bản ghi. Bạn có nhận được điều đó từ bất kỳ liên kết Perl nào không? Và, nếu bạn không hiểu Ben Nadel đã làm như thế nào, bạn sẽ không biết cách làm một regex cho những trường hợp không chuẩn. Tốt hơn là tìm kiếm SO cho các regex phân tích cú pháp csv. Tôi đã đăng một vài bản thân mình. – sln

+0

Chính xác. các dòng mới nằm bên trong dấu ngoặc kép vẫn là cùng một hàng/trường. Tôi nghĩ rằng tôi đã hiểu 'CSVToArray' và nó đã giải quyết vấn đề trước mắt của chúng tôi. Tôi sẽ đọc qua một vài câu trả lời của bạn để đánh dấu. Cảm ơn! – nelsonic

Trả lời

9

Bạn đã thử CSVToArray bởi Ben Nadel chưa?

/** 
* 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 
} 

trong trường hợp của bạn gọi nó với:

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

nơi CSV_string là chuỗi dữ liệu của bạn CSV.

+1

Đã hoạt động! Cảm ơn! – nelsonic

+0

Có cách nào để nhận các ô riêng lẻ không? –

Các vấn đề liên quan