web-dev-qa-db-fra.com

Split, réorganiser, concat inline

Je veux diviser une cellule, réorganiser les pièces et recombiner. Par exemple:

| name        | reordered name |
| Page,Larry  | Larry Page     |
| Brin,Sergey | Sergey Brin    |

Je sais que =SPLIT(A2, ",") divisera les valeurs dans les deux prochaines colonnes et je sais que je peux concaténer des valeurs avec =CONCATENATE(A2, " ", B2).

Comment puis-je réunir ces choses dans une seule formule?

Puis-je accéder aux valeurs de SPLIT et les réorganiser?

Je sais que je peux faire =CONCATENATE(SPLIT(A2)) (mais évidemment c'est stupide).

Dans Ruby, je voudrais juste faire quelque chose comme:

def reorder_name(cell)
  names = cell.split(",")
  "#{names[1]} #{names[0]}"
end
5
Andrew Hubbs

Avec la fonction personnalisée suivante (comme vous êtes habitué à écrire en JavaScript), cela est également possible:

Code

function myReverse(range) {
  var output = [];
  if(range[0].length > 1) {
    throw ("function can only handle a column range");
  } else {
    for(var i in range) {
      var name = range[i][0].split(",");
      output.Push([name.reverse().join(" ")]);
    }
  }
  return output;
}

Remarque

La gestion des petites erreurs génère un message lorsque la plage contient plus d'une colonne. Fonctions similaires à ARRAYFORMULA pour accepter les plages. Ajouter du code sous Outils, éditeur de script. Enregistrez le script et vous êtes prêt à partir!

Formule

La formule suivante fera également l'affaire:

=CONCATENATE(INDEX(SPLIT(A2, ","),1,2)," ",INDEX(SPLIT(A2, ","),1,1))

La fonction INDEX vous permet de sélectionner des cellules particulières dans une plage CONTINUED. Dans ce cas, vous souhaitez que le deuxième résultat de division apparaisse en premier, ainsi le ,1,2, qui signifie première ligne, deuxième colonne du résultat de division.

Exemple

J'ai préparé un exemple de fichier pour vous: scinder et réorganiser

5
Jacob Jan Tuinstra

Utilisez ces fonctions GSheet pour inverser l'ordre des mots dans une chaîne.

Écrivez dans la cellule A1 ="TRICK NO THIS IS"
et dans la cellule B1 =JOIN(" ";TRANSPOSE(SORT(TRANSPOSE(SPLIT(A1;" "));1;FALSE)))

Il crée _IS THIS NO TRICK_ à partir de l'entrée de A1.

Lisez la formule de l'intérieur vers l'extérieur:

  • SPLIT crée un tableau dans une rangée ("virtuel" si la formule est utilisée telle quelle) des mots de A1 séparés par des blancs
  • TRANSPOSE crée un tableau vertical à partir du tableau horizontal
  • SORT trie un tableau vertical, 1 = une seule colonne et FALSE inverse l'ordre
  • TRANSPOSE crée à nouveau un tableau horizontal à partir du tableau vertical réordonné
  • JOIN concatène le tableau horizontal de mots en une chaîne avec des blancs entre 2 dans B1.
2
Kerdaleos
=CONCATENATE(MID(A1,FIND(",",A1)+1,999), " ",LEFT(A1,FIND(",",A1)-1))

Un type sur ce fil a posté comment récupérer les bits, je les ai juste emballés dans le concat.

Notez que le "+1" dans la partie +1 999 sera votre ajustement s'il y a des espaces ou non après la virgule. Étant donné que le vôtre n’a pas d’espace, je viens de le ramener à 1 au lieu de 2 comme dans la page référencée.

1
panhandel

Il est également possible de scinder le prénom nom en deux colonnes, d'ajouter un séparateur de virgule et un ordre inverse. Très utile pour les écritures de paie de correction.

            A               B            C
| firstname lastname  |  lastname  | firstname |
| JOHN BROWN          |  BROWN,    | JOHN      |
| MARTHA GREEN        |  GREEN,    | MARTHA    |

dans la colonne B

=SPLIT(TRIM(MID($A1,FIND(" ",$A1,1)+1,100)) 
&", "& TRIM(LEFT($A1,FIND(" ",$A1,1)-1))," ",FALSE)
1
Jael Faulcon
name             reordered name
Page,Larry       Larry Page 
Brin, Sergey     Sergey Brin

formule:

=index(split(A2, ","), 0, 2)&" "&index(split(A2, ","), 0, 1)
0
psima

Egalement possible avec des expressions régulières:

=regexreplace(A1,"[A-z]+,","")&" "&regexextract(A1,"\w*")
0
pnuts