0
votes

Comment ajouter un préfixe à tous les numéros en fonction du nombre de chiffres du plus grand nombre?

J'ai créé une liste de répertoires de mon Google Drive dans Cloudfare Index. La logique de tri du fichier est assez étrange pour une raison quelconque. Il trie le fichier dans la séquence de 0 pour chaque chiffre et si le numéro de chiffre correspond à un chiffre, il vérifie le deuxième chiffre à partir de 0 et ainsi de suite ..

Les fichiers triés apparent comme ceci de haut en bas 1, 10, 100, 101..109, 11, 110, 111..119, 12

Il y a un moyen facile de le réparer, mais cela m'a besoin de renommer manuellement chaque fichier et d'ajouter le préfixe 0 sur le nombre de chiffres du plus grand nombre, mais il y a des centaines / milliers d'entre eux. J'utiliserai JavaScript pour renommer tous mes fichiers, il accepte de saisir de nouveaux noms au format suivant, (OA est la matrice où j'entraîne de nouveaux noms pour chaque fichier).

je me demandais si La fonction AWK / PERL / REGEX peut produire la sortie attendue lorsqu'il est exécuté sur fichier.txt

Exemple 1

fichier de chat.text xxx

sortie attendue xxx

exemple 2

fichier de chat.txt xxx

sortie attendu xxx

Exemple 3

fichier de chat .txt xxx

sortie attendu xxx

Comme vous l'avez peut-être remarqué, seul le préfexe 0 doit être ajouté à chaque numéro requis, l'ordre des conférences est toujours préreverd (son important)

si je devais l'expliquer comme ça ...

1) saisir le plus grand nombre après le mot conférence et vérification son nombre de chiffres. 2) Maintenant, tous les numéros auront le même nombre de chiffres que le plus grand nombre, ajouter au préfixe Zeros à chaque numéro si nécessaire


9 commentaires

Il trie de manière lexicographique, pas numériquement, BTW. Selon ce qui est utilisé pour trier votre liste de fichiers, il pourrait y avoir un moyen de trier d'une autre manière sans avoir à renommer les fichiers.


@Shawn Merci d'avoir répondu, surtout je n'ai pas connu ce que cette façon de tri est appelée. Bon à le savoir maintenant, bien que je ne connaisse aucune façon de modifier la méthode de tri de cet indice de travailleurs cloudfare, cela pourrait être possible mais devra creuser assez plus, je vais l'essayer de temps en temps. Pour l'instant, je dirais que la manipulation de chiffres fera le travail


Ce qui suit est une mise en œuvre de Ruby, qui devrait être facilement transférable à l'une des langues mentionnées. r = / (? <= \ alecture) \ d + /; DEF Convertir (ARR); mx = arr.map {| S | s [r] .Size} .max; arr.map {| S | S.GSUB (R) {| T | t.Rjust (mx, '0')}}; fin . L'argument de la méthode convert est une matrice telle que celles définies comme oa dans les exemples. MX est la taille de la chaîne la plus longue de chiffres suivant 'conférence' . La méthode RJUST est définie Ainsi, .


Vous recherchez une solution pour corriger l'ordre de la liste ou renommer les fichiers? Renommer des fichiers sur Google Drive nécessitera plus d'efforts de réparation de la liste.


@ Dash-o renommer les fichiers évidemment. Vous pouvez comparer la sortie attendue avec le texte original


@ Dash-o Oui, je suis d'accord mais c'est sa méthode de listes de lecteur de Google. Son trieur d'index cloudfare triant. GDRive semble trier numériquement mais je devais l'ajuster pour le tri correctement sur l'indice des cloudfare


Pouvez-vous publier votre script 'renommé' (ou version abrégée). Il sera plus facile de suggérer une solution qui fonctionne bien avec la logique de renommée. Pouvez-vous clarifier le tableau d'entrée - quel moteur de script avez-vous le 'OA = [....]' - Est-ce une matrice Awk, Perl ou Shell


@ Dash-o Sûr, pourquoi pas. Voici tout le script Renane - del.dog/crappanoon.txt . Je vais l'exécuter sur script.google.com pour renommer tous les fichiers. La ligne que j'ai postée en question est la saisie de la nouvelle saisie, c'est-à-dire .oa = ... dans la première ligne de script, j'espère que vous avez compris maintenant


Merci d'avoir partagé. Je comprends que vous recherchez un moyen de générer le tableau «OA» que vous pouvez nourrir le code AppScript / JavaScript. Beaucoup plus clair maintenant


3 Réponses :


1
votes

Un script donné fonctionnera dans GoogleApp, voir la solution JavaScript suivante. Il s'agit d'oa de l'ia

  1. trouver la séquence la plus longue li>
  2. boucle sur le document, remplacez la séquence avec une séquence à zéro, placez-le dans li> ol>

    la console.log est pour vérification. Supprimer et utilisez la méthode de renommée que vous avez déjà après le test. P>

    iA=['Lecture 7 - Topic.mp4','Lecture 56 - Topic.mp4','Lecture 3 - Topic.mp4','Lecture 4 - Topic.mp4']
    let seq_len=1
    
    // Collect sequence, find largest
    for (doc of iA) {
            let seq = doc.match("\\d+")[0]
            if ( seq.length > seq_len ) seq_len = seq.length
    }
    
    oA=[]
    for (doc of iA) {
            let old_seq = doc.match("\\d+")[0]
            let new_seq = old_seq
            while ( new_seq.length < seq_len ) new_seq = "0" + new_seq
            oA.push( doc.replace(old_seq, new_seq))
    }
    
    console.log(seq_len)
    console.log (oA)
    


3 commentaires

Merci d'avoir répondu, j'ai couru le code JS mais l'OA n'est pas généré sous le format requis, c'est-à-dire (en 1 ligne comme l'IA est présent). Vous pouvez vérifier la sortie ici - del.dog/pebalelofu.txt


Aussi les supports d'ouverture et de fin d'ouverture carrés ont un espace supplémentaire, je peux le faire manuellement, mais juste en déclarant


FYI: La sortie suit les règles JavaScript. Vous n'avez pas besoin de mettre tous les éléments du tableau sur une sortie dans votre code. Mon autre commentaire est que ce n'est qu'un code, vous pouvez l'intégrer dans votre autre sniplet (celui qui effectue le renommer)



2
votes

en Perl, la solution se résume à l'opérateur de répétition x . dans le code ci-dessous, la ligne cruciale est

My $ RADDING = " 0 "x ($ maxlen- $ therlen);

the Perl Documentation sur les opérateurs dit ceci sur x : "Dans le contexte scalaire ou si l'opérande gauche n'est pas conçu entre parenthèses, il renvoie une chaîne composée de l'opérande gauche répété le nombre de fois spécifié par L'opérande droit. "

de sorte qu'il répétera le chiffre 0 suffisamment de temps pour faire un certain nombre de longueurs $ thislen dans un certain nombre de longueur $ maxlen .

Le code donne la sortie correcte pour chacun des exemples. xxx

Voici le code complet qui effectue la tâche demandée. < / strong> xxx


1 commentaires

Bonjour monsieur, j'avais besoin d'une très petite aide concernant cette réponse, pouvez-vous le lire ici - del.dog/raw/ ogirfimor



1
votes

solution alternative - Perl.

#! /usr/bin/perl
use List::Util qw(max) ;

while ( <> ) {
        if ( s/^iA=/oA=/ ) {
                my $maxlen = max(map { length } /Lecture (\d+)/g) ;
                s/(Lecture )(\d+)/sprintf("%s %0${maxlen}d", $1, $2)/eg ;
                print ;
        }
}


0 commentaires