ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript はどのようにして引用符で囲まれたフィールドにカンマが含まれる CSV 文字列を効果的に解析できるのでしょうか?

JavaScript はどのようにして引用符で囲まれたフィールドにカンマが含まれる CSV 文字列を効果的に解析できるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-08 11:46:11269ブラウズ

How Can JavaScript Effectively Parse CSV Strings with Commas in Quoted Fields?

JavaScript を使用した引用符で囲まれた CSV フィールドのカンマの処理

JavaScript で CSV (カンマ区切り値) 文字列を処理する場合、解析により次のことが起こります。データの引用符で囲まれたフィールド内にカンマが含まれる場合は、困難になります。詳細なソリューションを使用してこのシナリオを効果的に処理する方法は次のとおりです:

CSV 文字列の検証および解析のための正規表現

入力文字列が有効な CSV 文字列であることを確認するには、検証正規表現を定義します:

re_valid = r"""
# Validate a CSV string having single, double or un-quoted values.
^                                   # Anchor to start of string.
\s*                                 # Allow whitespace before value.
(?:                                 # Group for value alternatives.
  '[^'\]*(?:\[\S\s][^'\]*)*'     # Either Single quoted string,
| "[^"\]*(?:\[\S\s][^"\]*)*"     # or Double quoted string,
| [^,'"\s\]*(?:\s+[^,'"\s\]+)*    # or Non-comma, non-quote stuff.
)                                   # End group of value alternatives.
\s*                                 # Allow whitespace after value.
(?:                                 # Zero or more additional values
  ,                                 # Values separated by a comma.
  \s*                               # Allow whitespace before value.
  (?:                               # Group for value alternatives.
    '[^'\]*(?:\[\S\s][^'\]*)*'   # Either Single quoted string,
  | "[^"\]*(?:\[\S\s][^"\]*)*"   # or Double quoted string,
  | [^,'"\s\]*(?:\s+[^,'"\s\]+)*  # or Non-comma, non-quote stuff.
  )                                 # End group of value alternatives.
  \s*                               # Allow whitespace after value.
)*                                  # Zero or more additional values
$                                   # Anchor to end of string.
"""

個々のデータを解析するには検証された CSV 文字列からの値を取得するには、次の正規表現を利用します:

re_value = r"""
# Match one value in valid CSV string.
(?!\s*$)                            # Don't match empty last value.
\s*                                 # Strip whitespace before value.
(?:                                 # Group for value alternatives.
  '([^'\]*(?:\[\S\s][^'\]*)*)'   # Either : Single quoted string,
| "([^"\]*(?:\[\S\s][^"\]*)*)"   # or : Double quoted string,
| ([^,'"\s\]*(?:\s+[^,'"\s\]+)*)  # or : Non-comma, non-quote stuff.
)                                   # End group of value alternatives.
\s*                                 # Strip whitespace after value.
(?:,|$)                             # Field ends on comma or EOS.
"""

CSV 解析関数

これらの正規表現を定義すると、次の正規表現を実装できます。 CSVを解析する文字列:

function CSVtoArray(text) {
  // Return NULL if input string is not well formed CSV string.
  if (!re_valid.test(text)) return null;
  var a = []; // Initialize array to receive values.
  text.replace(re_value, // "Walk" the string using replace with callback.
    function(m0, m1, m2, m3) {
      // Remove backslash from \' in single quoted values.
      if (m1 !== undefined) a.push(m1.replace(/\'/g, "'"));
      // Remove backslash from \" in double quoted values.
      else if (m2 !== undefined) a.push(m2.replace(/\"/g, '"'));
      else if (m3 !== undefined) a.push(m3);
      return ''; // Return empty string.
    });
  // Handle special case of empty last value.
  if (/,\s*$/.test(text)) a.push('');
  return a;
}

使用例

入力 CSV 文字列とそれに対応する解析された出力の例をいくつか示します:

// Test string from original question
let result = CSVtoArray("'string, duppi, du', 23, lala");
console.log(result);  // ['string, duppi, du', '23', 'lala']

// Empty CSV string
let result = CSVtoArray("");
console.log(result);  // []

// CSV string with two empty values
let result = CSVtoArray(",");
console.log(result);  // ['', '']

// Double quoted CSV string having single quoted values
let result = CSVtoArray("'one','two with escaped \' single quote', 'three, with, commas'");
console.log(result);  // ['one', 'two with escaped \' single quote', 'three, with, commas']

// Single quoted CSV string having double quoted values
let result = CSVtoArray('"one","two with escaped \" double quote", "three, with, commas"');
console.log(result);  // ['one', 'two with escaped " double quote', 'three, with, commas']

// CSV string with whitespace in and around empty and non-empty values
let result = CSVtoArray("   one  ,  'two'  ,  , ' four' ,, 'six ', ' seven ' ,  ");
console.log(result);  // ['one', 'two', '', 'four', '', 'six ', ' seven ']

// Not valid
let result = CSVtoArray("one, that's me!, escaped \, comma");
console.log(result);  // null

このソリューションは、CSV 文字列の正確な解析を保証し、指定された条件を遵守しながら、カンマを含む引用符で囲まれたフィールドを処理します。要件。

以上がJavaScript はどのようにして引用符で囲まれたフィールドにカンマが含まれる CSV 文字列を効果的に解析できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。