Обнаружение новых текстовых блоков для создания функций в Google Таблицах

Я импортировал текстовый файл, содержащий 3 блока текста. Я хочу иметь возможность распознавать новый блок текста, который всегда разделен двумя строками. Затем присоедините текст в строках для этого текстового блока и добавьте текст между каждой строкой.

Вот таблица Google, чтобы сделать свою копию для воспроизведения или редактирования. Просто зайдите в Файл -> Сделайте копию https://docs.google.com/spreadsheets/d/18dAX7P3gCnkUorkYOksyDUfFs_e34uqiwzNjupffo2A/copy


person Gracie    schedule 25.01.2020    source источник
comment
можете ли вы привести пример желаемого результата?   -  person player0    schedule 25.01.2020


Ответы (4)


Вот мой лист решения. Это всего лишь одна формула в ячейке B1. Его можно редактировать, так что вы можете покопаться, если хотите. Возьмите его на тест-драйв. Двухрядная граница между блоками материала важна для его работы.

https://docs.google.com/spreadsheets/d/1sKcBuHwh4v0UECRtUX4mPfE6NOCPkyafhNYs7LSSa0A/edit?usp=sharing

Вот решение:

=ARRAYFORMULA({"";IF({1;ARRAY_CONSTRAIN(A1:A,ROWS(A3:A),1)&ARRAY_CONSTRAIN(A2:A,ROWS(A3:A),1)=""},TRANSPOSE(SUBSTITUTE(TRIM(QUERY(IF((LOOKUP(ROW(A2:A),{2;FILTER(ROW(A3:A),ARRAY_CONSTRAIN(A1:A,ROWS(A3:A),1)&ARRAY_CONSTRAIN(A2:A,ROWS(A3:A),1)="")})=TRANSPOSE(LOOKUP(ROW(A2:A),{2;FILTER(ROW(A3:A),ARRAY_CONSTRAIN(A1:A,ROWS(A3:A),1)&ARRAY_CONSTRAIN(A2:A,ROWS(A3:A),1)="")})))*(A2:A<>""),A2:A&CHAR(10),),,9^99)),CHAR(10),"<break time="&CHAR(34)&"1000ms"&CHAR(34)&"/>")),)})

Надеюсь, что это работает.

person MattKing    schedule 31.01.2020

попробуйте вот так:

=TEXTJOIN("<break time=""1000ms""/>", 1, A4:A6)
person player0    schedule 26.01.2020
comment
Отличный материал, есть ли способ определить новый текстовый блок? Которая всегда разделяется двумя пустыми строками. - person Gracie; 26.01.2020

У меня есть два решения, но они кажутся утомительными, черт возьми.

[Мне бы хотелось увидеть элегантное решение, использующее формулы массива и позволяющее добиться всего лишь одной формулы в одной ячейке.]

Эти решения зависят от поиска двух предыдущих строк, чтобы убедиться, что они пусты.

Ссылка на лист с решениями


Решение А

Решение A использует номер строки, чтобы решить, сколько строк объединить. А затем использует TextJoin(), чтобы избежать пустых строк. Объединенный вывод создается в начале каждого блока.

Решение A


Решение B

Решение B продолжает объединять текст, пока не обнаружит, что две предыдущие строки были пустыми. Затем все начинается заново. В этом случае объединенный вывод создается в конце каждого блока.

Решение Б

PS: Чтобы они работали, вам также понадобятся две пустые строки перед первым текстовым блоком.

person ADW    schedule 27.01.2020
comment
Это очень хорошо, поскольку вы говорите, что ArrayFormula будет бездействовать, но это выглядит хорошо. Посмотрим, что еще появится. - person Gracie; 28.01.2020
comment
@ADW, вы упомянули, что хотите увидеть решение этой сложной проблемы с помощью одной ячейки. Моя здесь на редактируемом листе, если вам все еще интересно. - person MattKing; 03.02.2020

У меня есть одно решение, но оно имеет те же ограничения, что и решение, упомянутое в ADW, а именно то, что для него требуется 2 строки перед первым текстовым блоком. Однако мне удалось поместить все формулы в 1 ячейку.

=if(AND(A18="",A16="",A17=""),row(),if((A16="")*(A17=""),textjoin("<break time=""1000ms""/>", 1,indirect("A"&row()&":"&concatenate("A",min(arrayformula(if((B19:B109="")*(B20:B110=""),"",row(B18:B))))))),""))

Это формула для ячейки B3, и вам просто нужно перетащить ее вниз по столбцу.

Кстати, я думаю, что решения ADW великолепны, но в решении A ADW есть небольшая ошибка, вам нужно будет добавить -1 в формулу, изменив ее с:

=indirect("A"&row()&":A"&row(indirect("E"&if(B3="","", min(B4:B)))))

to

=indirect("A"&row()&":A"&row(indirect("E"&if(B3="","", min(B4:B)-1))))

Я просто комментирую здесь, поскольку у меня недостаточно репутации, чтобы комментировать его решение.

person edmund chan kei yun    schedule 30.01.2020