ACTUALIZACIÓN - Respuesta modificada

Con la ayuda de @ player0, encontré una solución que también manejaba los separadores de línea:

=ARRAYFORMULA(REGEXREPLACE(TRANSPOSE(QUERY(TRANSPOSE(SPLIT(TRANSPOSE(SPLIT(QUERY( IF(D1:D="[task]", "♦"&D1:D, "♣♀"&D1:D),,999^99), "♦", )), "♀")),,999^99)),"\s*♣\s*",char(10)))

Esto mueve cada sección [tarea] a su propia celda, conservando el resto del formato, y detiene el espacio en blanco adicional que se agrega alrededor del contenido de cada celda que se une / concat.



Publicación original

Parece que no puedo encontrar en ningún otro lugar, esto está hecho, así que estoy feliz por los enlaces en los comentarios también :)

Tengo una columna de texto, el contenido de más de cien archivos con [task] en la parte superior de cada uno.

Más de 50,000 caracteres , por lo que pegaron en una nueva línea cada celda ('pegar como valores').

Puedo decir fácilmente los números de fila para trabajar y tener una fórmula de trabajo arrastrable, simplemente no puedo obtenerla correctamente ARRAYFORMULA capaz , ya que la entrada puede cambiar fácilmente por mil filas, por lo que debe manejarlo con gracia .


Fórmulas solo por favor, sin código


Ejemplo de hoja de cálculo Ampliación de la imagen a través de la pantalla de control de la pantalla. edit? usp = sharing

Ejemplo de entrada (más de 50,000 caracteres) https://drive.google.com/file/d/1sMlZZkbb_H0B5_f_05 ver? usp = compartir

Nota: si el archivo de entrada se elimina cuando limpio mi unidad, simplemente copie y pegue la muestra a continuación hasta más de 50,000 caracteres, o vea la hoja de cálculo vinculada


Entrada

[task]
SpriteNE = floor_metal_01.dds
SpriteSE = floor_metal_01.dds
SpriteSW = floor_metal_01.dds
SpriteNW = floor_metal_01.dds
guilevel = 1
guiindex = 10
type = COMPONENT
locked = 0
name = category_advanced_manufacturing
parent

[task]
SpriteNE = floor_metal_01.dds
SpriteSE = floor_metal_01.dds
SpriteSW = floor_metal_01.dds
SpriteNW = floor_metal_01.dds
guilevel = 1
guiindex = 9
type = COMPONENT
locked = 0
name = category_facilities
parent

[task]
tilelable
SpriteNE = conveyor_NE.dds
SpriteSE = conveyor_SE.dds
SpriteSW = conveyor_SW.dds
SpriteNW = conveyor_NW.dds
exitdirectionoffsets = 0
inputdirectionoffsets = 2
guilevel = 1
parent
guiindex = 0.5
name = task_conveyor
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_SE.dds

[task]
tilelable
SpriteNE = conveyor_converge3_NE.dds
SpriteSE = conveyor_converge3_SE.dds
SpriteSW = conveyor_converge3_SW.dds
SpriteNW = conveyor_converge3_NW.dds
exitdirectionoffsets = 0,
inputdirectionoffsets = 1,2,3
guilevel = -1
parent
guiindex = 1
name = task_conveyor_converge3
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_converge3_SE.dds

[task]
tilelable
SpriteNE = conveyor_crossover_NE.dds
SpriteSE = conveyor_crossover_SE.dds
SpriteSW = conveyor_crossover_SW.dds
SpriteNW = conveyor_crossover_NW.dds
exitdirectionoffsets = 0,3
inputdirectionoffsets = 1,2
guilevel = -1
parent
guiindex = 1
name = task_conveyor_crossover
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_crossover_SE.dds

[task]
tilelable
SpriteNE = conveyor_left_NE.dds
SpriteSE = conveyor_left_SE.dds
SpriteSW = conveyor_left_SW.dds
SpriteNW = conveyor_left_NW.dds
exitdirectionoffsets = 3
inputdirectionoffsets = 2
guilevel = -1
parent
guiindex = 1
name = task_conveyor_left
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_left_SE.dds

[task]
tilelable
SpriteNE = conveyor_right_NE.dds
SpriteSE = conveyor_right_SE.dds
SpriteSW = conveyor_right_SW.dds
SpriteNW = conveyor_right_NW.dds
exitdirectionoffsets = 1
inputdirectionoffsets = 2
guilevel = -1
parent
guiindex = 1
name = task_conveyor_right
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_right_SE.dds

[task]
tilelable
SpriteNE = conveyor_split3_NE.dds
SpriteSE = conveyor_split3_SE.dds
SpriteSW = conveyor_split3_SW.dds
SpriteNW = conveyor_split3_NW.dds
exitdirectionoffsets = 0,1,3
inputdirectionoffsets = 2
guilevel = -1
parent
guiindex = 1
name = task_conveyor_split3
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_split3_SE.dds

[task]
tilelable
SpriteNE = conveyor_t_NE.dds
SpriteSE = conveyor_t_SE.dds
SpriteSW = conveyor_t_SW.dds
SpriteNW = conveyor_t_NW.dds
exitdirectionoffsets = 3,1
inputdirectionoffsets = 2
guilevel = -1
parent
guiindex = 1
name = task_conveyor_t
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_t_SE.dds

[task]
tilelable
SpriteNE = conveyor_t_join_NE.dds
SpriteSE = conveyor_t_join_SE.dds
SpriteSW = conveyor_t_join_SW.dds
SpriteNW = conveyor_t_join_NW.dds
exitdirectionoffsets = 0
inputdirectionoffsets = 1,3
guilevel = -1
parent
guiindex = 1
name = task_conveyor_t_join
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_t_join_SE.dds

[task]
tilelable
SpriteNE = conveyor_t_join_left_NE.dds
SpriteSE = conveyor_t_join_left_SE.dds
SpriteSW = conveyor_t_join_left_SW.dds
SpriteNW = conveyor_t_join_left_NW.dds
exitdirectionoffsets = 0
inputdirectionoffsets = 2,3
guilevel = -1
parent
guiindex = 1
name = task_conveyor_t_join_left
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_t_join_left_SE.dds

[task]
tilelable
SpriteNE = conveyor_t_join_right_NE.dds
SpriteSE = conveyor_t_join_right_SE.dds
SpriteSW = conveyor_t_join_right_SW.dds
SpriteNW = conveyor_t_join_right_NW.dds
exitdirectionoffsets = 0
inputdirectionoffsets = 1,2
guilevel = -1
parent
guiindex = 1
name = task_conveyor_t_join_right
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_t_join_right_SE.dds

[task]
tilelable
SpriteNE = conveyor_t_left_NE.dds
SpriteSE = conveyor_t_left_SE.dds
SpriteSW = conveyor_t_left_SW.dds
SpriteNW = conveyor_t_left_NW.dds
exitdirectionoffsets = 0,3
inputdirectionoffsets = 2
guilevel = -1
parent
guiindex = 1
name = task_conveyor_t_left
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_t_left_SE.dds

[task]
tilelable
SpriteNE = conveyor_t_right_NE.dds
SpriteSE = conveyor_t_right_SE.dds
SpriteSW = conveyor_t_right_SW.dds
SpriteNW = conveyor_t_right_NW.dds
exitdirectionoffsets = 0,1
inputdirectionoffsets = 2
guilevel = -1
parent
guiindex = 1
name = task_conveyor_t_right
is_conveyor = 1

[components]

[resources]

[subtasksrequired]

[subtasksapplied]

[tile]
texture = conveyor_t_right_SE.dds


Salida deseada

Cada [tarea]. * Es un archivo nuevo, por lo que los separan en una celda cada una en una sola columna, con líneas nuevas (\n) como separadores internos.

En otras palabras, todo después de [tarea] hasta la siguiente [tarea] (o al final de la columna, si no hay más [tarea]) se combinan en una celda cada una.

Solo tiene que ser capaz de matricularse y evitar el límite de caracteres para funciones como concat de 50,000 caracteres.


Salida actual

Obtener números de fila

$D$1:D es la columna de entrada

$G$1 es desplegable con "[task]" seleccionado

$M$1 =ARRAYFORMULA(QUERY({$D1:$D, row($D1:$D)},"select * where Col1 = '"&$G$1&"'"))
$O$1 =ARRAYFORMULA(QUERY({$M1:$M,{$M2:$M;0}},"select *"))


Luego, algunos de mis intentos de usar estos números


Funciona, debe arrastrarse y no tiene separadores .

=ARRAYFORMULA(CONCATENATE(INDIRECT("$D"&$O1:$O&":$D"&$P1:$P-1)))


No funciona, seguí agregando más fórmulas de matriz, pero aún así solo el primer resultado

=ARRAYFORMULA(IF($P1:P<>"",CONCATENATE(ARRAYFORMULA(INDIRECT("$D"&ARRAYFORMULA(INDIRECT("$O"&IF($P1:$P<>"",row($P1:$P),"")&":$O"))&":$D"&ARRAYFORMULA(INDIRECT("$P"&IF($P1:$P<>"",row($P1:$P),"")&":$P"))-1))),""))


Solo la cadena utilizada en INDIRECT anterior

=ARRAYFORMULA(IF($O1:O<>"","$D"&ARRAYFORMULA(INDIRECT("$O"&IF($P1:$P<>"",row($P1:$P),"")&":$O"))&":$D"&ARRAYFORMULA(INDIRECT("$P"&IF($P1:$P<>"",row($P1:$P),"")&":$P"))-1,""))


No funciona, tiene separadores pero todavía solo repite el primer resultado.

$U1:U es la lista de cadenas para indirectos (ver arriba)

=ARRAYFORMULA(IF($U1:U<>"",TEXTJOIN(";",FALSE,INDIRECT($U1:U)),""))


Hay algunas otras fórmulas en la hoja de ejemplo, aunque en su mayoría eliminé los trapos mientras continuaba.

Encontré muchos recursos interesantes por ahí, pero nada que parecía apuntar usando números de fila, o incluso solo el enfoque de tipo SPLIT + JOIN que permitió ARRAYFORMULA ( Y evitó el problema del límite de 50,000 caracteres con single CONCAT o llamadas similares).

1
Daniel Brose 3 ene. 2020 a las 06:48

2 respuestas

La mejor respuesta

Tratar:

=ARRAYFORMULA(SPLIT(TRANSPOSE(SPLIT(QUERY(
 IF(A2:A="[task]", "♦"&A2:A, "♀"&A2:A),,999^99), "♦", )), "♀"))

0

1
player0 3 ene. 2020 a las 06:19

Esto es una muestra, como dije antes en el comentario, simplemente llama a la función en la celda "= GroupMacro" desafortunadamente, esto no se puede actualizar automáticamente:

var rtrn=[];
var rslt=[];
var rslt2='';

function GroupMacro() {
  var spreadsheet = SpreadsheetApp.getActive();
  var bomo=spreadsheet.getRange('D1:D' + spreadsheet.getLastRow()).getValues();
  for (a=0; a<bomo.length; a++)
  {
    if(bomo[a]=='test') //this is separator, this can be applied as parameter in function
    {
      if(a>0)
      {
         rslt2=rslt.join();
         rtrn.push(rslt2);
         rslt=[];
      }
      rslt.push(bomo[a]);
    }
    else
    {
      rslt.push(bomo[a]);
    }
  }
  rslt2=rslt.join();
  rtrn.push(rslt2);
  return rtrn;
};
1
user11982798 4 ene. 2020 a las 17:34