2016-03-29 6 views
5

Dato un file CSV che ha caratteri di ritorno/ritorno in alcuni campi, come si analizzano i dati senza dividere un campo in più righe.Come analizzare i dati CSV che contengono nuove righe nel campo utilizzando JavaScript

Esempio dati 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" 

Nota: i campi sono in realtà separati da virgola ; perché l'indirizzo può contenere virgole

Ogni riga dispone di 7 campi, ma non vogliamo analizzare erroneamente i dati in un campo contenente caratteri di nuova riga come più righe ...

Abbiamo trovato alcune risposte Perl-centrati su StackOverflow:

ma io sono un po 'arrugginito su Perl e non hanno scoperto una risposta JS-focalizzata.

+1

Le nuove linee racchiuse tra virgolette doppie non sono la fine del record. L'hai preso da uno di quei collegamenti Perl? E, se non capisci come ha fatto Ben Nadel, non saprai come eseguire un'espressione regolare per casi non standard. È meglio cercare SO per l'analisi delle espressioni regolari csv. Ne ho pubblicato parecchi anch'io. – sln

+0

Esattamente. le nuove linee che si trovano tra virgolette sono sempre la stessa riga/campo. Penso di aver capito il 'CSVToArray' e ha risolto il nostro problema immediato. Leggero alcune delle tue risposte RegEx per rispolverare. Grazie! – nelsonic

risposta

9

Hai provato CSVToArray da 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 
} 

nel tuo caso invocare con:

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

dove CSV_string è la stringa di dati CSV.

+1

Ha funzionato! Grazie! – nelsonic

+0

C'è un modo per ottenere anche singole celle? –

Problemi correlati