23.

カンマ区切り文字列 → 配列変換まとめ(JavaScript split / PHP explode / Python

編集
この記事の要点
  • 基本は split / explode。JS: str.split(",") / PHP: explode(",", $str) / Python: str.split(",")
  • 空白除去は map で trim: JS str.split(",").map(s => s.trim()) / PHP array_map("trim", explode(",", $str))
  • 空要素フィルタ: JS .filter(Boolean) / PHP array_filter() / Python リスト内包 [s for s in ... if s]
  • CSV(クォート / エスケープ / 改行を含む)は 必ず CSV パーサ: PHP str_getcsv(), Python csv.reader, JS Papa Parse
  • 正規表現分割で複数区切り: JS str.split(/[,;]\s*/)。複雑な構造化データは split を使わず JSON / CSV ライブラリを使うのが安全

JavaScript: String.prototype.split

'apple,banana,cherry'.split(',');
// ['apple', 'banana', 'cherry']

// 空白を含む場合
'apple, banana , cherry'.split(',');
// ['apple', ' banana ', ' cherry']   ← 空白付き

// trim でクリーンに
'apple, banana , cherry'.split(',').map(s => s.trim());
// ['apple', 'banana', 'cherry']

// 空要素を除く
'a,,b,'.split(',');                  // ['a', '', 'b', '']
'a,,b,'.split(',').filter(Boolean);  // ['a', 'b']

// 分割数の制限
'a,b,c,d'.split(',', 2);   // ['a', 'b']

// 数値配列に
'1,2,3,4'.split(',').map(Number);     // [1, 2, 3, 4]
'1, 2, 3'.split(',').map(s => parseInt(s, 10));

// 複数の区切り(正規表現)
'a,b;c d'.split(/[,;\s]+/);  // ['a', 'b', 'c', 'd']

PHP: explode と str_getcsv

 $v !== '');
// [0 => 'a', 2 => 'b']   ← キーが歯抜けに注意

// キーを振り直す
$arr = array_values($arr);
// ['a', 'b']

// 数値化
$nums = array_map('intval', explode(',', '1,2,3'));
// [1, 2, 3]

// 分割数の制限
explode(',', 'a,b,c,d', 2);   // ['a', 'b,c,d']

// CSV(クォート / エスケープ対応)
$csv = '"Hello, World",foo,"bar ""baz"""';
$arr = str_getcsv($csv);
// ['Hello, World', 'foo', 'bar "baz"']

Python: split と csv モジュール

# 基本
'apple,banana,cherry'.split(',')
# ['apple', 'banana', 'cherry']

# 空白除去
[s.strip() for s in 'apple, banana , cherry'.split(',')]
# ['apple', 'banana', 'cherry']

# 空要素除去
[s for s in 'a,,b,'.split(',') if s]
# ['a', 'b']

# 数値化
list(map(int, '1,2,3'.split(',')))
# [1, 2, 3]

# 分割数の制限
'a,b,c,d'.split(',', maxsplit=2)
# ['a', 'b', 'c,d']

# 複数の区切り
import re
re.split(r'[,;\s]+', 'a,b;c d')
# ['a', 'b', 'c', 'd']

# CSV
import csv
import io
reader = csv.reader(io.StringIO('"Hello, World",foo,bar'))
for row in reader:
    print(row)
# ['Hello, World', 'foo', 'bar']

言語別早見表

言語基本CSV
JavaScriptstr.split(',')Papa Parse
PHPexplode(',', $str)str_getcsv()
Pythonstr.split(',')csv.reader
Javastr.split(",")OpenCSV / Apache Commons CSV
C#str.Split(',')CsvHelper
Rubystr.split(',')CSV.parse
Gostrings.Split(s, ",")encoding/csv
SQL (MySQL)SUBSTRING_INDEXFIND_IN_SET

CSV は必ず CSV パーサを使う

split で CSV をパースするのは禁忌。クォート、エスケープ、フィールド内改行に対応できません:

# 危険な CSV
name,address,note
"山田 太郎","東京都, 千代田区","彼は ""エキスパート"" だ"

# split(',') すると壊れる
# → ['"山田 太郎"', '"東京都', ' 千代田区"', ... ]  ← クォート内のカンマを誤分割

JavaScript で本格 CSV: Papa Parse

// npm install papaparse
import Papa from 'papaparse';

const csv = `name,age,city
山田太郎,30,"東京都, 千代田区"
鈴木一郎,25,大阪府`;

const result = Papa.parse(csv, {
  header: true,
  skipEmptyLines: true,
  dynamicTyping: true,  // 数値を自動変換
});

console.log(result.data);
// [
//   { name: '山田太郎', age: 30, city: '東京都, 千代田区' },
//   { name: '鈴木一郎', age: 25, city: '大阪府' }
// ]

SQL: カンマ区切り文字列を行に展開

-- MySQL 8+ / Postgres / SQLite で利用可能
-- 例: 'a,b,c' を 3 行に分解

-- MySQL 8 (再帰 CTE)
WITH RECURSIVE split(word, str) AS (
  SELECT
    SUBSTRING_INDEX('apple,banana,cherry', ',', 1),
    SUBSTRING(CONCAT('apple,banana,cherry', ','),
              LENGTH(SUBSTRING_INDEX('apple,banana,cherry', ',', 1)) + 2)
  UNION ALL
  SELECT
    SUBSTRING_INDEX(str, ',', 1),
    SUBSTRING(str, LENGTH(SUBSTRING_INDEX(str, ',', 1)) + 2)
  FROM split WHERE str <> ''
)
SELECT word FROM split WHERE word <> '';

-- Postgres は string_to_array + unnest
SELECT unnest(string_to_array('apple,banana,cherry', ','));

-- SQL Server 2016+ は STRING_SPLIT
SELECT value FROM STRING_SPLIT('apple,banana,cherry', ',');

逆: 配列 → カンマ区切り文字列

['a', 'b', 'c'].join(',');        // 'a,b,c'
['a', 'b', 'c'].join(', ');       // 'a, b, c'

// PHP
implode(',', ['a', 'b', 'c']);    // 'a,b,c'

// Python
','.join(['a', 'b', 'c'])         # 'a,b,c'
', '.join(map(str, [1, 2, 3]))    # '1, 2, 3'   ← int を str 化が必要

FAQ

Q: 末尾のカンマで空要素が残る
A: 'a,b,'.split(',')['a', 'b', '']。空文字を除外したいなら .filter(Boolean).filter(s => s !== '') を使ってください。

Q: タブ区切り (TSV) の場合は
A: str.split('\t') でも動きますが、CSV パーサに delimiter: '\t' を渡すのが安全。

Q: ネストされた配列を CSV にしたい
A: CSV は 2 次元表形式が前提。ネスト構造には JSON を使うのが筋。CSV にどうしても入れるなら、内部をエスケープ済 JSON 文字列にしてセルに格納します。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール方法
  2. 文法
  3. Composerのインストール
  4. 内部関数
  5. フレームワーク
  6. エラー一覧
  7. 改行出力
  8. printとechoの違い
  9. シングルクォートとダブルクォートの違い
  10. returnとyieldの違い
  11. var_dumpをログ出力
  12. CSV読み込み
  13. 待機・処理の遅延
  14. ログファイルにエラーを出力する方法
  15. エラーログ出力関数
  16. URLパラメータの配列化
  17. empty, is_null. issetの判定比較表
  18. httpステータスコードの付与
  19. バージョンの確認
  20. php.ini
  21. APIを呼び出す方法
  22. 外部ファイルを呼び出す方法
  23. カンマ区切りの文字列を配列に変換
  24. 配列からランダムに値を取り出す方法
  25. Webスクレイピング