配列を返す単一の数式で文字列の列を分割する


8

次のような文字列の列があります。

+---------+
| a bb    |
| ccc d   |
| ee ffff |
+---------+

(各文字列に正確に1つのスペース)、スペースで2つの列に分割したい:

+-----+------+
| a   | bb   |
| ccc | d    |
| ee  | ffff |
+-----+------+

これはB1 =split(A1," ")、列を配置して下にドラッグすることで実行できます。しかし、私はarrayformulaこれのバージョンを探しています。

失敗した試行:数式 =arrayformula(split(A1:A3," "))が#VALUEエラーをスローします:「関数SPLITパラメータ1の値は空ではないはずです。」


私はエラーやエラーは発生しませんが、=arrayformula(split(A1:A3," "))とにかく期待通りに機能しません。
ルベン

@Rubénこのために古いシートを使用していますか?私は新しいです。で、この答えヤコブはARRAYFORMULA分割を使用し、それは古いシートにしました。

新しいGoogleスプレッドシートも使用しています。
ルベン

正規表現を使用して複数の列を処理することができる別の式のために、参照stackoverflow.com/a/30202802/1595451
ルベン

回答:


3

1つの正規表現のみを使用するNormalの式のバリエーション(列Aから開始して列Aのデータを想定)

=ArrayFormula(if(len(A2:A), regexextract(A2:A, {"^[^ ]+","[^ ]+$"}),))

1
レコードの場合:コンマなどの別の文字で分割するに[^ ][^,]、2つの場所でに置き換えます。

1
1つの正規表現を使用して両方の部分を取得することには副作用があります。「abc 123」のような文字列を分割すると、2番目の結果は数値ではなくテキストになります。長いバージョンで{regexextract(A2:A, "^[^ ]+"), regexextract(A2:A,"[^ ]+$")}は123が数字になります。

@ 404はテスト済みです。そうではありません(少なくとも私にとっては)。:-/しかし、驚かないでください。正規表現はテキストを操作します。2番目の部分を数値に変換する場合は、次のようなものが必要です。= arrayformula({regexextract(A2:A3; "^ [^] +")\ regexextract(A2:A3; "[^] + $" )+0})
JPV 2016年

3

Googleはこの目的のために組み込みのツールを導入しました:テキストを列に分割します

  1. 分割する範囲を選択します。セパレータメニューはこの範囲の一番下になることに注意してください(これは、非常に高い列を分割する場合にはあまり便利ではありません)。
  2. メニューから「列をテキストに分割」を使用します
  3. セパレータを選択します。
  4. 警告:列を分割すると、分割する列の右側のセルが上書きされる可能性があります。

セパレーター


2

これは、Rubénの答えに似た正規表現ベースの式です。

=arrayformula({regexextract(A1:A3,"^[^ ]+"), regexextract(A1:A3,"[^ ]+$")})

ここで、^[^ ]+は、文字列の先頭にある[^ ]+$すべての非スペース文字と、を意味します:文字列の最後にあるすべての非スペース文字を意味します。スペースをコンマなどで置き換えることができます。たとえば、[^,]

これは、セパレータを1つだけ含む文字列のみを対象としています。それ以外の場合、出力は正しくありません。

カスタム機能

任意の数の文字列への分割を処理するために、として使用できるカスタム関数を作成しましたarraysplit(A1:A3, " ")。最初のパラメーターとして列範囲(または単一のセル)を受け入れ、2番目のパラメーターとしてセパレーターを受け入れます。

組み込みsplit関数とは異なり、これは空の文字列を無視しません。たとえば、a,b,,cコンマで分割すると4つのセルになり、3番目のセルは空白になります。(私の意見では、空の文字列を無視することは、組み込みsplit関数の設計における大きな欠陥です。)

/**
 * Splits a column of strings by a separator.
 *
 * @param {A1:A3} range    Column range or a single cell
 * @param {" "} separator  Separating character or substring
 * @returns                Substrings, including empty strings
 * @customfunction
 */
function arraysplit(range, separator) {
  if (range.constructor !== Array) {
    range = [[range]];    // handle single-cell input
  }
  if (range[0].length !== 1) {
    throw new Error('First argument must be a column range');
  }
  var i, j, split, output = [], width = 1;
  for (i = 0; i < range.length; i++) {
    split = range[i][0].split(separator);
    output.push(split);  
    width = Math.max(width, split.length);   // max number of pieces 
  }
  for (i = 0; i < output.length; i++) {
    for (j = 0; j < width - output[i].length; j++) {
      output[i].push('');   // empty string to make rectangular array
    }
  }
  return output;
}

ボーナス機能:組み込みの分割とは異なり、arraysplit空の文字列を区切り文字として受け入れます。その場合、文字列は個別の文字に分割されます。(もちろん、この動作はJavaScriptのsplitメソッドから単純に継承されます。)


関数は、を使用して結果を返す代わりに、カスタムエラーメッセージとしてエラーメッセージを返すことができますthrow。参照してくださいmogsdad.wordpress.com/2015/07/08/...
ルベン・

1
知っておくと便利です。含まれています。

1

簡潔な答え

=ArrayFormula(
   {
      Left(A1:A3,FIND(" ",A1:A3)-SIGN(ROW(A1:A3))),
      Right(A1:A3,Len(A1:A3)-Find(" ",A1:A3))
    }
 )

説明

ルックスSPLIT()入力パラメータとして配列を有するが、「のような」ないLEFT()RIGHT()FIND()およびLEN()それらとよく仕事。

2列の配列が使用されます。
最初の列はで取得されLEFT()ます。
2番目の列はで取得されRIGHT()ます。
FIND()列セパレータの位置を見つけるために使用されます。最初の列の一部としてセパレータを必要としないため、各行から1を減算する配列が必要です(SIGN(ROW(A1:A3)))。
LEN()-FIND()がとる文字数を教えてくださいRIGHT()


1

以下を試してください:

=arrayformula({split(A1:A3," ")})

わたしにはできる。


この数式では中括弧を使用する必要はありません。
ルベン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.