2016-03-29 24 views
5

Biorąc pod uwagę plik CSV, który zawiera znaki nowej linii/zwracanych w niektórych polach, w jaki sposób analizować dane bez dzielenia pola na kilka wierszy.Jak analizować dane CSV, które zawierają znaki nowej linii w polu przy użyciu JavaScript

Przykład CSV danych:

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" 

Uwaga: pola są rzeczywiście oddzielone średnikiem ; ponieważ adres może zawierać przecinków

Każdy wiersz ma 7 pól, ale nie chcemy omyłkowo przeanalizować dane w polu zawierającym znaki nowego wiersza jako wiele wierszy ...

Znaleźliśmy kilka Perl skoncentrowanego odpowiedzi na StackOverflow:

ale jestem nieco zardzewiały na Perl i nie odkrył JS-koncentruje odpowiedź.

+1

Newlines zawijane w podwójne cudzysłowy nie są końcem zapisu. Czy otrzymałeś to z dowolnego z tych linków Perla? A jeśli nie rozumiesz, w jaki sposób zrobił to Ben Nadel, nie będziesz wiedział, jak to zrobić w przypadku niestandardowych przypadków. Lepszym rozwiązaniem jest wyszukiwanie SO w przypadku wyrażeń regularnych parsowania csv. Sam napisałem sporo. – sln

+0

Dokładnie. nowe linie, które znajdują się w podwójnych cudzysłowach, nadal są tym samym wierszem/polem. Myślę, że zrozumiałem "CSVToArray" i rozwiązało to nasz natychmiastowy problem. Przeczytam kilka twoich odpowiedzi RegEx, żeby odświeżyć. Dzięki! – nelsonic

Odpowiedz

9

Czy próbowałeśBen Nadel?

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

w przypadku powoływania go:

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

gdzie CSV_string jest ciąg danych CSV.

+1

Pracował! Dzięki! – nelsonic

+0

Czy istnieje sposób na zdobycie pojedynczych komórek? –