Chaîne délimitée «divisée», préservant les entrées vides

10

J'essaie d'utiliser les fonctions SPLITet JOINdans Google Sheets (la nouvelle version) pour manipuler certaines données, et je rencontre des problèmes car je SPLITne conserve pas les entrées vides.

La source de données est configurée comme ceci, essentiellement:

   |  A    B    C    D
-----------------------
1  |  q    5    r    2
2  |  s         t    4
3  |  u    8    v
4  |  w    3    x    6

(Les entrées vides dans cet ensemble de données représentent "aucune mesure", ce qui est distinct d'une mesure de 0)

Sur les colonnes Aet Cj'obtiens le résultat souhaité en utilisant la formule:

=SPLIT(JOIN("~",A1:A4,C1:C4),"~")

Cela produit une ligne qui va, comme prévu q s u w r t v x, chacune dans sa propre cellule.

Cependant, cette méthode ne fonctionne pas sur les colonnes Bet D. JOINfonctionne comme prévu, donnant la sortie:

5~~8~3~2~4~~6

SPLITCependant, l' exécution de cette sortie entraîne un problème: je me retrouve avec 5 8 3 2 4 6, sans cellules vides entre 5et 8ou entre 4et 6, ce qui signifie que les paires sont rompues (par exemple set vdevraient correspondre à des cellules vides, mais à la place wet à xfaire). Le problème semble être qu'il SPLITinterprète ~~comme un seul délimiteur, plutôt que comme deux délimiteurs avec une entrée nulle entre eux.

Quelqu'un sait-il comment conserver les entrées vides dans ce type de scénario?

La sortie souhaitée ressemblerait à ceci

q  s  u  w  r  t  v  x
5     8  3  2  4     6
LiberalArtist
la source
Un espace dans ces champs vides résoudrait-il le problème?
ale
La saisie de "" entraîne la conservation de l'entrée vide (merci, @AlE.!), Mais il serait toujours préférable d'avoir une solution technologique, notamment parce que la saisie manuelle de "" dans toutes ces entrées prendrait beaucoup de temps et sujettes à erreur.
LiberalArtist
Les formules de feuille de calcul ne sont pas mon point fort. Peut-être que quelque chose peut être fait IF()pour convertir automatiquement les champs vides en espaces.
ale
1
Mise à jour: L'idée de @ AlE. M'a permis de faire le calcul dans l'immédiat en utilisant =ARRAYFORMULA(IF(ISBLANK(B1:B4)," ",B1:B4))pour créer un ensemble factice de colonnes avec "" dans les cellules vides, qui sont ensuite utilisées pour SPLITet JOIN. En espérant toujours que quelqu'un ait une solution plus élégante, cependant: cela ajoute un tas de choses supplémentaires à mon document, et il me faut toujours mettre à jour les numéros de ligne à quelques endroits différents à mesure que davantage de mesures sont ajoutées à l'ensemble de données. (Merci à AI E. de m'avoir au moins permis de croquer les données pour l'instant!)
LiberalArtist

Réponses:

3

Essayez la solution suivante.

Formule

=ARRAYFORMULA(TRIM(SPLIT(JOIN(" ,", A1:A4,C1:C4), ",")))

Expliqué

Vous nous avez montré déjà que la SPLITfonction ignore les cellules vides, donc je choisis cette chaîne comme delimiter: " ,". Le résultat intermédiaire de la JOINfonction, ressemble à ceci:
entrez la description de l'image ici

Je choisis le délimiteur pour le SPLIT: être cette fonction ",". Le résultat intermédiaire de la SPLITfonction, ressemble à ceci:
entrez la description de l'image ici

Maintenant, cependant, nous devons faire face aux espaces blancs supplémentaires ajoutés. Par conséquent, j'ai utilisé la TRIMfonction pour supprimer tous les espaces blancs à la fin ou en tête (en combinaison avec le ARRAYFORMULA). Comparez les LENvaleurs de chaque résultat intermédiaire.

Résultat

entrez la description de l'image ici

Exemple

J'ai créé un exemple de fichier pour vous: SPLIT pour conserver les cellules vides

Jacob Jan Tuinstra
la source
2

Essayez la solution suivante.

Code

function myJoin() { 
  var output = []; 
  for(var i = 0, iLen = arguments.length; i < iLen; i++) {
    for(var r = 0, rLen = arguments[i].length; r < rLen; r++) {
      output.push(arguments[i][r][0]);
    }    
  }
  return [output];
}

Usage

entrez la description de l'image ici

Ajoutez autant de plages à la fonction que vous le souhaitez et elles seront traitées. Ajoutez ce petit script dans l'éditeur de script de votre feuille de calcul (Outils> Editeur de script; appuyez sur le bouton Enregistrer).

Exemple

J'ai créé un exemple de fichier pour vous: SPLIT pour conserver les cellules vides

Jacob Jan Tuinstra
la source
2

Réponse courte

La formule suivante renvoie le résultat souhaité.

=Transpose({A1:B4;C1:D4})

Réponse étendue

Cette réponse vise à fournir un moyen d'obtenir le résultat souhaité au lieu de discuter de la façon de faire fonctionner l'approche choisie.

Le problème XY

L'OP veut obtenir X et pense que Y devrait retourner ce résultat. Cette approche est problématique car Y a quelques mises en garde. Cela pourrait être un problème majeur car l'OP demande comment faire fonctionner Y au lieu de demander un moyen d'obtenir X, mais ce n'est pas si grand car il fournit le contexte et le résultat souhaité.

Solution

Google Sheets est capable de gérer des résultats à valeurs multiples de manière très simple du point de vue des utilisateurs finaux. En revanche, il permet d'utiliser une notation spéciale pour permettre aux utilisateurs finaux de définir des tableaux.

Les fonctionnalités ci-dessus permettent d'obtenir le résultat attendu sans l'utilisation des fonctions SPLIT () et JOIN () et sans les mises en garde qui leur sont inhérentes.

Explication de la formule

{A1:B4;C1:D4}

C'est un tableau 2 X 8 composé de deux tableaux / plages 2 X 4. Le point-virgule ( ;) est utilisé en supposant que le séparateur décimal de la feuille de calcul est un point ( .). Si le séparateur décimal était une virgule, remplacez-le par une barre oblique inverse ( \).

=Transpose({A1:B4;C1:D4})

Convertit le tableau 2 X 8 en tableau 8 X 2.

L'un des avantages de cette méthode est qu'elle ne nécessite pas de manipulation particulière des cellules vides. D'autres avantages sont que c'est une formule très compacte et très facile à adapter.

Références

Rubén
la source
1

Si vous vous joignez et que le délimiteur soit "," essentiellement une virgule avec un espace précédent, il conservera automatiquement cet espace lorsque vous le diviserez à nouveau:

=SPLIT(JOIN(" ,",A1:A4),",")
Aurielle Perlmann
la source