Teilen Sie eine Spalte mit Zeichenfolgen mit einer einzelnen Formel, die ein Array zurückgibt

8

Ich habe eine Spalte mit solchen Zeichenfolgen:

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

(genau ein Leerzeichen in jeder Zeichenfolge), das ich durch das Leerzeichen in zwei Spalten aufteilen möchte:

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

Dies kann durch Setzen B1 =split(A1," ")und Ziehen der Spalte erfolgen. Aber ich suche nach einer arrayformulaVersion davon.

Erfolgloser Versuch: Die Formel =arrayformula(split(A1:A3," "))löst den Fehler #VALUE aus: "Der Wert von Funktion SPLIT-Parameter 1 sollte nicht leer sein."


quelle
Ich bekomme keine Fehler, =arrayformula(split(A1:A3," "))aber es funktioniert bei mir sowieso nicht wie gewünscht.
Rubén
@ Rubén Benutzt du dafür Old Sheets? Meins ist neu. In dieser Antwort verwendete Jacob Arrayformula-Split und es war in einem alten Blatt.
Ich verwende auch die neuen Google Sheets.
Rubén
Eine alternative Formel, die Regex verwendet und mehrere Spalten verarbeiten kann, finden Sie unter stackoverflow.com/a/30202802/1595451
Rubén

Antworten:

3

Eine Variation der Normalschen Formel unter Verwendung nur eines regulären Auszuges (unter der Annahme von Daten in Spalte A, beginnend in Zeile 2)

=ArrayFormula(if(len(A2:A), regexextract(A2:A, {"^[^ ]+","[^ ]+$"}),))
JPV
quelle
1
Für das Protokoll: durch ein anderes Zeichen, wie ein Komma zu trennen, würde man ersetzen [^ ]mit [^,]an zwei Stellen.
1
Es gibt einen Nebeneffekt bei der Verwendung eines regulären Auszuges, um beide Teile zu erhalten: Wenn Sie Zeichenfolgen wie "abc 123" teilen, ist das zweite Ergebnis eher Text als eine Zahl. Die lange Version {regexextract(A2:A, "^[^ ]+"), regexextract(A2:A,"[^ ]+$")}macht 123 zu einer Zahl.
@ 404 gerade getestet. Das tut es nicht (zumindest nicht für mich). : - / Sollte jedoch nicht überraschen: Regex verarbeitet Text. Wenn Sie den zweiten Teil in eine Zahl konvertieren möchten, benötigen Sie Folgendes: = arrayformula ({regexextract (A2: A3; "^ [^] +") \ regexextract (A2: A3; "[^] + $") ) +0})
JPV
3

Zu diesem Zweck hat Google ein integriertes Tool eingeführt: Text in Spalten aufteilen .

  1. Wählen Sie einen zu teilenden Bereich aus. Beachten Sie dabei, dass sich das Trennmenü am unteren Rand dieses Bereichs befindet (dies ist nicht sehr praktisch, um eine sehr hohe Spalte zu teilen).
  2. Verwenden Sie "Spalte in Text teilen" aus dem Menü
  3. Wählen Sie ein Trennzeichen.
  4. Warnung : Die Zellen rechts von der Spalte, die Sie teilen, werden möglicherweise überschrieben, wenn die Spalte geteilt wird.

Separator


quelle
2

Hier ist eine Regex-basierte Formel, die Rubéns Antwort ähnelt :

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

Hier ^[^ ]+bedeutet: alle Nicht-Leerzeichen am Anfang der Zeichenfolge und [^ ]+$bedeutet: alle Nicht-Leerzeichen am Ende der Zeichenfolge. Man kann Leerzeichen durch Komma usw. ersetzen: zum Beispiel[^,]

Dies ist nur für Zeichenfolgen gedacht, die genau ein Trennzeichen enthalten. Andernfalls ist die Ausgabe falsch.

Benutzerdefinierte Funktion

Um die Aufteilung in eine beliebige Anzahl von Zeichenfolgen zu handhaben, habe ich eine benutzerdefinierte Funktion geschrieben, die als verwendet werden kann arraysplit(A1:A3, " "). Es akzeptiert Spaltenbereiche (oder einzelne Zellen) als ersten Parameter und Trennzeichen als zweiten Parameter.

Im Gegensatz zur eingebauten splitFunktion ignoriert diese leere Zeichenfolgen nicht: a,b,,cZB durch Komma geteilt werden vier Zellen, von denen die dritte leer ist. (Meiner Meinung nach ist das Ignorieren leerer Zeichenfolgen ein großer Fehler im Design der integrierten splitFunktion.)

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

Bonusfunktion: Im Gegensatz zur integrierten Aufteilung werden arraysplitleere Zeichenfolgen als Trennzeichen akzeptiert. In diesem Fall werden die Zeichenfolgen in separate Zeichen aufgeteilt. (Natürlich wird dieses Verhalten einfach von der Split-Methode von JavaScript geerbt.)

Gemeinschaft
quelle
Ihre Funktion könnte die Fehlermeldung als benutzerdefinierte Fehlermeldung zurückgeben, anstatt mithilfe von ein Ergebnis zurückzugeben throw. Siehe mogsdad.wordpress.com/2015/07/08/…
Rubén
1
Das ist gut zu wissen; inbegriffen.
1

Kurze Antwort

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

Erläuterung

Sieht so aus, SPLIT()als würde es Arrays nicht mögen, Arrays als Eingabeparameter zu LEFT()haben RIGHT(), FIND()und sie LEN()funktionieren gut damit.

Ein Array mit zwei Spalten wird verwendet.
Die erste Spalte wird mit erhalten LEFT().
Die zweite Spalte wird mit erhalten RIGHT().
FIND()wird verwendet, um die Position des Säulentrenners zu ermitteln. Da das Trennzeichen nicht Teil der ersten Spalte sein soll, benötigen wir ein Array, um 1 von jeder Zeile ( SIGN(ROW(A1:A3))) zu subtrahieren .
LEN()-FIND()Geben Sie uns die Anzahl der Zeichen, die von genommen werden sollen RIGHT().

Rubén
quelle
1

Versuchen Sie Folgendes:

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

Für mich geht das.

Mark Lin
quelle
Bei dieser Formel müssen keine geschweiften Klammern verwendet werden.
Rubén