Tách một cột chuỗi bằng một công thức duy nhất trả về một mảng


8

Tôi có một cột các chuỗi như thế này:

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

(chính xác là một khoảng trắng trong mỗi chuỗi), mà tôi muốn chia khoảng trắng thành hai cột:

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

Điều này có thể được thực hiện bằng cách đặt B1 =split(A1," ")và kéo xuống cột. Nhưng tôi đang tìm kiếm một arrayformulaphiên bản này.

Nỗ lực không thành công: công thức =arrayformula(split(A1:A3," "))đưa ra lỗi #VALUE: "Giá trị tham số SPLIT 1 của hàm nên không trống."


Tôi không nhận và lỗi cho =arrayformula(split(A1:A3," "))nhưng dù sao nó cũng không hoạt động với tôi như mong muốn.
Rubén

@ Rubén Bạn có đang sử dụng Tấm cũ cho việc này không? Của tôi là mới. Trong câu trả lời này, Jacob đã sử dụng phân chia mảng, và nó nằm trong một tờ cũ.

Tôi cũng đang sử dụng Google Sheets mới.
Rubén

Để biết công thức thay thế bằng cách sử dụng regex và có thể xử lý nhiều cột, hãy xem stackoverflow.com/a/30202802/1595451
Rubén

Câu trả lời:


3

Một biến thể của công thức Bình thường chỉ sử dụng một biểu thức chính (giả sử dữ liệu trong col A, bắt đầu từ hàng 2)

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

1
Đối với bản ghi: để phân chia bởi một ký tự khác, chẳng hạn như dấu phẩy, người ta sẽ thay thế [^ ]bằng [^,]hai vị trí.

1
Có một tác dụng phụ của việc sử dụng một biểu thức chính để lấy cả hai phần: khi tách các chuỗi như "abc 123", kết quả thứ hai kết thúc là văn bản chứ không phải là một số. Phiên bản dài {regexextract(A2:A, "^[^ ]+"), regexextract(A2:A,"[^ ]+$")}làm cho 123 một số.

@ 404 vừa được thử nghiệm. Nó không (ít nhất là đối với tôi). : - / Không nên gây ngạc nhiên: regex hoạt động trên văn bản. Nếu bạn muốn chuyển đổi phần thứ hai thành một số bạn cần một cái gì đó như: = Arrayformula ({regexextract (A2: A3; "^ [^] +") \ regexextract (A2: A3; "[^] + $" ) +0})
JPV

3

Google đã giới thiệu một công cụ tích hợp cho mục đích này: Chia văn bản thành các cột .

  1. Chọn một phạm vi để phân chia, hãy nhớ rằng menu phân cách sẽ ở dưới cùng của phạm vi này (điều này không thuận tiện cho việc tách một cột rất cao).
  2. Sử dụng "Tách cột thành văn bản" từ menu
  3. Chọn một dải phân cách.
  4. Cảnh báo : các ô ở bên phải của cột bạn đang chia có thể bị ghi đè khi chia tách cột.

dải phân cách


2

Đây là một công thức dựa trên regex tương tự như câu trả lời của Rubén :

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

Ở đây, ^[^ ]+có nghĩa là: tất cả các ký tự không phải khoảng trắng ở đầu chuỗi và [^ ]+$có nghĩa là: tất cả các ký tự không phải khoảng trắng ở cuối chuỗi. Người ta có thể thay thế không gian bằng dấu phẩy, v.v .: ví dụ:[^,]

Điều này chỉ có nghĩa đối với các chuỗi chứa chính xác một dấu phân cách: nếu không, đầu ra sẽ sai.

Chức năng tùy chỉnh

Để xử lý việc chia thành một số chuỗi tùy ý, tôi đã viết một hàm tùy chỉnh có thể được sử dụng như arraysplit(A1:A3, " "). Nó chấp nhận các phạm vi cột (hoặc các ô đơn) làm tham số đầu tiên và dấu phân cách làm tham số thứ hai.

Không giống như splithàm tích hợp, hàm này không bỏ qua các chuỗi trống: ví dụ: a,b,,cphân tách bằng dấu phẩy trở thành bốn ô, phần thứ ba trống. (Theo tôi, bỏ qua các chuỗi trống là một lỗ hổng lớn trong thiết kế của splithàm tích hợp.)

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

Tính năng phần thưởng: không giống như phần tách rời tích hợp, arraysplitchấp nhận chuỗi rỗng dưới dạng dấu tách, trong trường hợp đó, phần tách chuỗi thành các ký tự riêng biệt. (Tất nhiên, hành vi này chỉ được kế thừa từ phương thức phân tách của JavaScript.)


Chức năng của bạn có thể trả về thông báo lỗi dưới dạng thông báo lỗi tùy chỉnh thay vì trả về kết quả bằng cách sử dụng throw. Xem mogsdad.wordpress.com/2015/07/08/ từ
Rubén

1
Đó là điều tốt để biết; bao gồm.

1

Câu trả lời ngắn

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

Giải trình

Ngoại hình mà SPLIT()không làm "like" có mảng như thông số đầu vào nhưng LEFT(), RIGHT(), FIND()LEN()làm việc tốt với họ.

Một mảng có hai cột được sử dụng.
Cột đầu tiên thu được với LEFT().
Cột thứ hai thu được với RIGHT().
FIND()được sử dụng để tìm vị trí của cột phân cách. Vì chúng tôi không muốn dấu phân cách là một phần của cột đầu tiên, chúng tôi yêu cầu một mảng để trừ 1 cho mỗi hàng ( SIGN(ROW(A1:A3))).
LEN()-FIND()cho chúng tôi số lượng nhân vật được thực hiện bởi RIGHT().


1

Hãy thử làm theo:

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

Nó làm việc cho tôi.


Không cần sử dụng niềng răng xoăn trên công thức này.
Rubén
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.