web-dev-qa-db-fra.com

Joindre deux lignes de données avec des délimiteurs alternés

Je travaille avec deux lignes de valeurs qui sont liées l'une à l'autre et j'essaye de construire une formule qui compilera les données dans une cellule, avec une syntaxe qui utilise deux délimiteurs.

Si une cellule de la ligne active contient une valeur, je souhaite extraire les informations des lignes 2 et 3, les coupler avec le délimiteur |, puis utilisez un autre délimiteur ; jusqu'à ce que toutes les valeurs aient été ajoutées. La sortie devrait finir comme:

1

J'ai essayé les fonctions textjoin, join et ifs, mais je ne trouve pas la bonne façon de structurer une formule pour y parvenir car je ne suis pas au courant d'un moyen de faire le L'argument alterne les valeurs sur deux lignes jusqu'à la fin des données. J'ai essayé d'imbriquer un autre textjoin mais cela n'ajoute que les valeurs/délimiteurs plutôt que de les alterner.

Toute suggestion sur la façon dont je pourrais structurer cela serait appréciée.

4
Steven D.

En supposant que vos colonnes de compétences sont de B à G (modifiez en fonction), essayez ceci:

=REGEXREPLACE(REGEXREPLACE(ARRAYFORMULA(JOIN(";",IF(NOT(LEN(B2:G2)),"",B$1:G$1&"|")&B2:G2)),";{2,}",";"),";$","")`

Il fait exactement ce que vous avez dit ... vérifiez les non-blancs et retournez les paires des entrées trouvées, puis il utilise des expressions rationnelles pour supprimer tous les points-virgules consécutifs ou à la fin.

0

1
Joel Reid

Répondre à ma propre question parce que j'ai réussi à trouver une solution distincte de Joel. Cela nécessite que j'utilise une approche légèrement différente des données, mais cela peut être utile pour les personnes qui abordent la réponse différemment.

J'ai créé une deuxième ligne (ligne 35) sous les lignes de niveau de compétence (ligne 34) dans l'image ci-dessus. Dans cette ligne, j'ai la formule suivante:

=ifs(ISBLANK(C34),,C34, (join("|", C33:C34)))

Cela ferait référence à la cellule ci-dessus pour la valeur définie pour cette compétence. Si la cellule référencée est vide, elle traite la cellule de formule comme un blanc, sinon, elle utilise join afin de lier l'ID de compétence au niveau de compétence avec | entre.

J'ai ensuite la deuxième formule pour générer mon résultat final:

=textjoin(";", TRUE, C35:H35)

Étant donné que le booléen de textjoin sautera toutes les cellules identifiées comme vides, cela concatène et délimite les compétences/niveaux de compétence combinés avec ; comme prévu à l'origine. S'il existe une solution plus simple en utilisant cette méthode, je ne sais pas encore comment la décomposer!

1
Steven D.

En supposant que vous ne voulez pas ajouter une autre ligne, car qui le fait, les éléments ci-dessous devraient fonctionner:

=JOIN(";",FILTER(
ArrayFormula(TRANSPOSE($C$2:$G$2)&"|"&TRANSPOSE(C3:G3)),
NOT(ISBLANK(TRANSPOSE(C3:G3)))
))
  • $ C $ 2: $ G $ 2 est votre plage de rangs d'identification de compétence
  • C3: G3 est votre plage de ROW d'ID de compétence individuelle

Le truc ici est que vous ajoutez juste un "|" à tout et utilisez FILTER pour supprimer les cellules qui sont vides dans une ligne donnée.

La transposition nous permet de traiter les lignes comme des colonnes, simplifiant le problème. Cependant, comme indiqué dans les commentaires, ils ne sont pas strictement nécessaires:

=JOIN(";",FILTER(
ArrayFormula($C$2:$G$2&"|"&C3:G3),
NOT(ISBLANK(C3:G3))
))
1
sageco
  • solution à une cellule:

    =ARRAYFORMULA(IF(LEN(C4:C&D4:D&E4:E&F4:F&G4:G&H4:H),
     REGEXREPLACE(REGEXREPLACE(TRANSPOSE(QUERY(TRANSPOSE(
     IF(C4:H<>"", C3:H3&"|", )&C4:H), , 50000)),
     " {5}| {4}| {3}| {2}| ", ";"), "^;|;$", ""), ))

    0

0
user0