2016-03-29 13 views
5

Belirli alanlarda yeni satır/dönüş karakterleri olan bir CSV dosyası verildiğinde, bir alanı birden fazla satıra ayırmadan verileri nasıl ayrıştırırız.JavaScript'i kullanarak alandaki yeni satırları içeren CSV verilerini ayrıştırma

Örnek CSV veri:

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" 

Not: alanların gerçekte Adres virgül Her satır 7 alanları vardır

içerebileceğinden noktalı virgül ; ayrılmış ancak biz istemiyoruz Yanlışlıkla yeni satır karakterleri içeren bir alandaki verileri birden fazla satır olarak ayırmak için ...

Biz StackOverflow'daki birkaç Perl odaklı cevapları bulundu:

ama Perl biraz paslandım ve JS-odaklı bir cevap keşfedilmiş değil.

+1

Çift tırnak içine alınan satırlar, kayıtların sonu değildir. Bu Perl bağlantılarından herhangi birini aldın mı? Ve, Ben Nadel'in bunu nasıl yaptığını anlamıyorsanız, standart olmayan durumlar için nasıl bir normal ifadeyi yapacağınızı bilmeyeceksiniz. Csv ayrıştırma regexleri için SO aramak daha iyidir. Kendimi çok az yayınladım. – sln

+0

Tam olarak. çift ​​tırnak içinde bulunan yeni satırlar hala aynı satır/alan. Ben 'CSVToArray' anladım düşünüyorum ve bizim acil sorun çözüldü. Bir kaç tane RegEx cevabını fırçalamak için okuyacağım. Teşekkürler! – nelsonic

cevap

9

Ben Nadel tarafından CSVToArray denediniz mi? CSV_string CSV verilerinizin dizedir

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

: sizin durumunuzda

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

ile çağırmak.

+1

Çalışıyor! Teşekkürler! – nelsonic

+0

Tek tek hücreler almanın bir yolu var mı? –

İlgili konular