web-dev-qa-db-fra.com

Conversion de texte en colonnes dans Google Spreadsheets

Comment effectuez-vous une conversion de texte en colonnes dans Google Spreadsheets?

Par exemple, j'ai la chaîne de données suivante dans une cellule:

5,233,6,2,6,7,2,2,6,6

Je veux le séparer par le séparateur de virgule en colonnes.

Edit: j'ai changé la réponse acceptée en une réponse qui n'utilise pas Google Apps Scripting, car Google semble très enclin à se mettre en colère.

32
Evan Plaice

La formule suivante fera exactement cela; texte à colonne:

A1=5,233,6,2,6,7,2,2,6,6
A2=SPLIT(A1;",")

Et la prochaine; text-to-row:

A1=5,233,6,2,6,7,2,2,6,6
A2=TRANSPOSE(SPLIT(A1;","))

PDATE 03-02-201
Si vous scindez le résultat de A1 et collez les valeurs, le résultat sera identique à celui de toutes les lignes de code utilisées dans la réponse de l'OP. Je lui ai donné un coup d’essai également avec Google Apps Script et voici ce que j’ai créé: texte en colonne

function mySplit() {
  var sh = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var cell = sh.getActiveCell().getValues()[0];
  var sCell = cell[0].split(",");
  var row = sh.getActiveCell().getRowIndex();
  var col = sh.getActiveCell().getColumnIndex();

  sh.getRange(row,col+1,1,sCell.length).setValues([sCell]);  
}

J'utilise simplement la fonction split intégrée pour scinder le résultat et l'ajouter à la feuille, rien de plus et rien de moins.

14
Jacob Jan Tuinstra

Utiliser Google Apps Scripting pour étendre l'interface utilisateur

Texte en colonnes est une fonctionnalité très pratique et l'une des raisons pour lesquelles de nombreux utilisateurs de Google Spreadsheet utilisent à nouveau Excel. En attendant que Google décide de prendre officiellement en charge cette fonctionnalité, cette solution peut être utilisée en tant que polyfill pour y ajouter des fonctionnalités.

Voici le code:

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menuEntries = [];
  menuEntries.Push({ name:"Text to columns", functionName:"textToColumns" });
  menuEntries.Push({ name:"Text to columns (custom separator)", functionName:"textToColumnsCustom" });
  menuEntries.Push(null);
  menuEntries.Push({ name:"Columns to Text", functionName:"columnsToText" });
  menuEntries.Push({ name:"Columns to Text (custom separator)", functionName:"columnsToTextCustom" });
  ss.addMenu("Advanced", menuEntries);
}

function textToColumnsCustom() {
  var separator = Browser.inputBox("Text to column","Enter the the separator",Browser.Buttons.OK);
  textToColumns(separator);
}

function columnsToTextCustom() {
  var separator = Browser.inputBox("Column to text","Enter the the separator",Browser.Buttons.OK);
  columnsToText(separator);
}

// Expands a single cell of CSV formatted text to multiple columns
function textToColumns(separator) {
  var sep = typeof(separator) !== 'undefined' ? separator : ',';
  var ss = SpreadsheetApp.getActiveSheet(); 
  var r = ss.getActiveRange();
  // check that only one column was selected
  var col = r.getColumn(); 
  if(col !== r.getLastColumn()) {
    Browser.msgBox("Error", "Invalid selection, too many columns.", Browser.Buttons.OK);
    return;
  }  
  var firstRow = r.getRow();
  // short cut the one row selection
  if(firstRow === r.getLastRow()) {
    var values = r.getValues().toString().split(sep);
    ss.getRange(firstRow,col+1,1,values.length).setValues(new Array(values));
    return;
  } else {
    var rows = r.getValues();
    var values = [];
    var cols = 0;
    for(var i = 0, len = rows.length; i < len; i++) {
      var rowValues = rows[i].toString().split(sep); 
      var rowValuesLen = rowValues.length;
      if(cols < rowValuesLen) { cols = rowValuesLen; }
      values.Push(rowValues);
    }
    // set all values at once (padding required because setValues doesn't accept jagged 2d arrays)
    padRow(values, cols);
    ss.getRange(firstRow,col+1,values.length,cols).setValues(values);
  }
}

// Pads a row with empty values to the specified length
function padRow(array, length) {
  for(var i = 0; i < array.length; i++) {
    var arrLen = array[i].length;
    if(arrLen < length) {
      var padLen = length - arrLen;
      var padding = new Array(padLen);
      array[i].Push.apply(array[i], padding);
      for(var j = 0, len = array[i].length; j < len; j++) {
        if(typeof(array[i][j]) === 'undefined') {
          array[i][j] = "";
        }
      }
    }
  }
  return array;
}

function columnsToText(separator) {
  var sep = typeof(separator) !== 'undefined' ? separator : ',';
  var ss = SpreadsheetApp.getActiveSheet(); 
  var r = ss.getActiveRange();
  var col = r.getColumn();  
  var firstRow = r.getRow();
  var rows = r.getValues();
  var values = [];
  for(var i = 0, len = rows.length; i < len; i++) {
    var value = rows[i].join(sep);
    values[i] = [value];
  }
  col -= 1;
  ss.getRange(firstRow,col,values.length,1).setValues(values);
}

Enregistrez et fermez l'éditeur de script. Ensuite, actualisez la feuille de calcul. Cela prendra une seconde à charger, mais vous devriez voir un menu appelé "Avancé" après "Aide" dans la barre d'outils.

tilisation:

  • Sélectionnez la ou les cellules contenant les valeurs à fractionner
  • Sélectionnez AvancéTexte en colonnes

C'est ça. Vous pouvez également effectuer une scission à l'aide d'un délimiteur personnalisé (via "Texte en colonnes (Custom)") et inverser le processus (via "Colonnes en texte").

17
Evan Plaice

J'ai utilisé la fonction split et cela a parfaitement fonctionné, car elle utilise également la formule continue et fait exactement la traduction du texte de la colonne A en colonnes BCDE avec un espacement correct.

Mon exemple:

Cell A1= text1, text2, date1, number1
Cell B1= split(A1,",")

Le résultat en B1 est text1. Le résultat dans C1 est text2. Le résultat dans D1 est date1. Le résultat dans E1 est numéro1.

Il prend en charge le format, puisque la date a été orthographiée le 1 juin et s'est traduite en 01/06.

Les formules divisées utilisées dans les cellules BCDE où CONTINUE(B1; 1; 2), CONTINUE(B1; 1; 3), CONTINUE(B1; 1; 4). Toute cette partie a été créée automatiquement.

3
user46580

Convertissez vos données csv en tsv (valeurs séparées par des tabulations).
Collez-le ensuite.

2
Ujjwal Singh

J'aime beaucoup la réponse d'Evan à l'aide du script Apps et j'ai apporté une petite amélioration: l'ajout de la prise en charge de la correspondance de délimiteur d'expression régulière. Au menuEntries de onOpen, j'ai ajouté:

menuEntries.Push({
  name: "Text to columns (regular expression separator)",
  functionName:"textToColumnsRegExp"
});

Et ajouté la fonction référencée:

function textToColumnsRegExp() {
  var separator = Browser.inputBox(
    "Text to column",
    "Enter the regular expression for the separator ",
    Browser.Buttons.OK);
  if (separator) {
    textToColumns(new RegExp(separator));
  }
}

Aucune autre modification n'a été nécessaire, car Evan utilise le fichier Javascript String.prototype.split, qui accepte une chaîne ou un objet RegExp comme délimiteur. Alors bravo l'Evan!

1
James Synge

De plus, après avoir utilisé la fonction SPLIT qui fournira le tableau contenant les valeurs séparées, vous pouvez isoler une ligne ou une colonne spécifique de ce tableau avec la fonction INDEX:

=index(split(importXML("https://www.google.com/search?q=stackexchange","//div[@id='resultStats']/text()")," "),1,2,1)

Peut être utile pour récupérer le nombre de résultats pour une requête Google par exemple

0
Giorgio M

Il semble y avoir un élément de menu qui peut aider avec ceci, à l’adresse: Données → Fractionner le texte en colonnes ...

  1. Cliquez une fois sur une cellule et collez vos données.

    Il apparaîtra sur plusieurs lignes mais une seule colonne.

  2. En laissant les cellules nouvellement remplies en surbrillance, accédez au menu Données → Fractionner le texte en colonnes ...

    Si l'application a réussi à détecter automatiquement vos séparateurs, alors félicitations: vous avez terminé!

    Sinon, un petit widget apparaîtra pour vous demander quel séparateur vous souhaitez scinder.

    Remarque: ce widget peut apparaître près du bas de la fenêtre , ce qui le rend un peu difficile à trouver!

  3. Utilisez le widget pour choisir le séparateur entre vos données: Virgule, Point-virgule, Période, Espace ou Personnalisé.

  4. Si vous vouliez vous séparer sur des onglets:

You can't!

0
joeytwiddle