Extraction de parties de textes d'une colonne vers plusieurs colonnes

Bonjour à toutes et à tous,

Document support : https://docs.google.com/spreadsheets/d/12nSqUNSFVHVdZyFvtOGCzkPksbPjbOvxJo0pdxsokyM/edit?usp=sharing

Sur la feuille 2, je cherche une formule unique à mettre en A2 permettant de décomposer chaque case de la colonne A de la feuille 3 dans un tableau de A à G comme suis :
- La colonne A doit contenir les 10 caractères suivants la balise "Date|" (sous format de date, pour trier par date)
- La colonne B doit contenir le texte comprit entre les balises "|Mb|" et "|Biais|"
- La colonne C doit être vide
- La colonne D doit contenir le texte comprit entre les balises "|Biais|" et "|Sujet|"
- La colonne E doit contenir le texte comprit entre les balises "|Sujet|" et "|Preci|"
- La colonne F doit être vide
- La colonne G doit contenir le texte comprit entre les balises "|Prix|" et "|Fin" (doit apparaître sous format monétaire)

Contrainte supplémentaire, la formule ne doit sortir des résultat que si la date (donc la colonne A) est comprise entre les deux saisies de la feuille 1 (B1 et B2).

J'ai essayé de m'aider de Gemini, les formules ne sortent pas de résultats concluants (sur le document que j'utilise pour de vrai, donc les plages sont différentes) :
Dans un premier temps j'ai eu pu avoir cette formule :

=FILTER(ARRAYFORMULA({TEXTE(DATEVAL(REGEXEXTRACT(bdd_locale!A:A;"Date\|(.{10})"));"jj/mm/aaaa");REGEXEXTRACT(bdd_locale!A:A;"\|Mb\|(.*)\|Biais\|");"";REGEXEXTRACT(bdd_locale!A:A;"\|Biais\|(.*)\|Sujet\|");REGEXEXTRACT(bdd_locale!A:A;"\|Sujet\|(.*)\|Preci\|");"";REGEXEXTRACT(bdd_locale!A:A;"\|Prix\|(.*)\|Fin")}); REGEXEXTRACT(bdd_locale!A:A;"Date\|(.{10})") >= A51;REGEXEXTRACT(bdd_locale!A:A;"Date\|(.{10})")<=B51)

Mais cela m'a donné l'erreur suivante : "La taille de plage pour la fonction FILTER est incohérente. Nombre de lignes attendu : 5002. Nombre de lignes réel : 1000. Nombre de colonnes réel : 1."

J'ai eu d'autres formules avec bidouillages pour essayer de voir comment régler le problème, mais seul la première colonne ressort, pas le reste.

Est-ce que quelqu'un aurait une idée ? Est-ce seulement réalisable ?

Merci d'avance pour votre précieuse aide !

Bonjour,

Tu peux utiliser ça :

=query({query(arrayformula(split('Feuille 3'!$A$1:$A$3;"|"));"select Col2,Col14")\H1:H3\query(arrayformula(split('Feuille 3'!$A$1:$A$3;"|"));"select Col16,Col18")\H1:H3\query(arrayformula(split('Feuille 3'!$A$1:$A$3;"|"));"select Col23")};"select * where Col1 > DATE '"&TEXT('Feuille 1'!$B$1;"yyyy-MM-dd")&"' and Col1 < DATE '"&TEXT('Feuille 1'!$B$2;"yyyy-MM-dd")&"' ")

https://docs.google.com/spreadsheets/d/1UVtkbbnD1kVXRQRAX163L76A3ljGG9Xpowr4zQuTNME/edit?usp=sharing

Cordialement,

Fil.

Salut,

Si c'est bien ce résultat qui est attendu :

image

J'ai mis un script relisant les filtrages demandé dans ton fichier, le voici ci-dessous au besoin, si tu recherches plutôt une formule, il faudrait que @Filoche passe par là.

function extraireDonnees() {

  // 1 on déclare les feuilles
  var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Feuille 1');
  var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Feuille 2');
  var sheet3 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Feuille 3');

  //2 on récupère les dates filtres
  var dateDebut = sheet1.getRange('B1').getValue();
  var dateFin = sheet1.getRange('B2').getValue();
  var dateDebutObj = new Date(dateDebut);
  var dateFinObj = new Date(dateFin);

  // 3 on récupères les données à extraires
  var data = sheet3.getRange(1, 1, sheet3.getLastRow(), 1).getValues();

  // 4 on prépare une variable pour stocker les données filtrées
  var results = []; 

  // 5 on itère sur chaque ligne de donnée à extraire
  for (var i = 0; i < data.length; i++) { 
    var ligne = data[i][0];

    // 6 Extraction de la date au format JJ/MM/AAAA + convertie en OBJET date 
    var dateMatch = ligne.match(/(\d{2}\/\d{2}\/\d{4})/); 
    if (dateMatch) {
      var dateLigneStr = dateMatch[1];
      var parts = dateLigneStr.split('/');
      var dateLigne = new Date(parts[2], parts[1] - 1, parts[0]);

      // 7 Vérifie si la date est entre la date de début et la date de fin
      if (dateLigne >= dateDebutObj && dateLigne <= dateFinObj) {

        // 8 SI oui,  Ajout des résultats filtrés à la liste
        var nom = ligne.match(/\|Mb\|(.*?)\|Biais\|/);
        var biais = ligne.match(/\|Biais\|(.*?)\|Sujet\|/);
        var sujet = ligne.match(/\|Sujet\|(.*?)\|Preci\|/);
        var prix = ligne.match(/\|Prix\|(\d+)\|Fin/);
        results.push([
          dateLigneStr,             // Date
          nom ? nom[1] : "",        // Nom
          "",                       // Rien
          biais ? biais[1] : "",    // Biais
          sujet ? sujet[1] : "",    // Sujet
          "",                       // Rien
          prix ? prix[1] : ""       // Prix
        ]);
      }
    }
  }

  // 9 Insère les résultats dans la feuille 2
  if (results.length > 0) {
    sheet2.getRange(2, 1, results.length, 7).setValues(results); 
  }
}

EDIT : quand on parles du loup c'est plus simple qu'un script en effet, en gros tu split les données aux séparateurs "|" puis tu gère ce tableau avec query ? Que signifie ceci dans ta formule : \H1:H3\ ?

Filoche est déjà passé par là !!!

Oui Pierre pour la question 1.

Pour la question 2, c'est pour insérer une colonne vide (C et F).

Merci à vous deux pour les solutions, c'est nickel !

Effectivement c'est plutôt la formule que je cherchais, et vue qu'elle n'est pas trop compliquée à comprendre je vais pouvoir la réutiliser sur d'autres choses

Rechercher des sujets similaires à "extraction parties textes colonne colonnes"