2016-03-29 8 views
5

特定のフィールドに改行文字または改行文字を含むCSVファイルを指定すると、フィールドを複数の行に分割せずにデータを解析する方法を教えてください。JavaScriptを使用してフィールドに改行を含むCSVデータを解析する方法

例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つのフィールドを持っていますが、我々はしたくないを含めることができるので、フィールドが実際にセミコロン;で区切られます改行文字を含むフィールドのデータを複数の行として誤って解析する...

私たちはStackOverflowの上でいくつかのPerl-焦点を当てて答えを見つけました:

が、私は、PerlのビットさびだとJS-焦点を当てた答えを発見していません。

+1

二重引用符で囲んだ改行は、レコードの終わりではありません。あなたはそれらのPerlリンクからそれを得ましたか? Ben Nadelがどのようにしたのか分からなければ、非標準の場合の正規表現をどうやって行うのか分からないでしょう。 Csvの正規表現を解析するためにSOを検索する方がよいでしょう。私はかなり自分自身を投稿しました。 – sln

+0

正確です。二重引用符の中にある新しい行は、まだ同じ行/フィールドです。私は 'CSVToArray'を理解しており、私たちの直面する問題を解決したと思います。私はあなたのRegExの回答を読んでブラッシュアップします。ありがとう! – nelsonic

答えて

9

Ben NadelさんがCSVToArrayを試しましたか? CSV_stringはCSVデータのあなたの文字列がある

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

:あなたのケースで

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

はでそれを呼び出します。

+1

Worked!ありがとう! – nelsonic

+0

個別のセルを取得する方法はありますか? –