2010-06-21 3 views
0

J'aimerais,noms de répertoire Liste par mot de nombre de fichiers

  1. Vérifiez le nombre de mots pour un dossier complet de fichiers texte.
  2. sortie une liste des fichiers classés par nombre de mots dans le format - FILENAME est WORDCOUNT

Je sais que str_word_count est utilisé pour obtenir wordcounts individuels pour les fichiers mais je ne suis pas sûr de savoir comment réorganiser la sortie.

Merci d'avance.

Répondre

1

Adapté de here.

<?php 
    $files = array(); 
    $it = new DirectoryIterator("/tmp"); 
    $it->rewind(); 
    while ($it->valid()) { 
     $count = str_word_count(file_get_contents($it->getFilename())); 
     $files[sprintf("%010d", $count) . $it->getFilename()] = 
      array($count, $it->getFilename()); 
     $it->next(); 
    } 

    ksort($files); 
    foreach ($files as $tup) { 
     echo sprintf("%s is %d\n", $tup[1], $tup[0]); 
    } 

EDIT Il serait plus élégant d'avoir $file « s clé soit le nom du fichier et $file » s valeur soit le nombre de mots et puis trier par valeur.

+0

Il sort les fichiers, mais ne les arrange pas par wordcount – usertest

+0

@user Etes-vous sûr? La version initiale a eu quelques erreurs que j'aurais corrigé. – Artefacto

+0

Je pense que le problème est que ksort dispose par clé, qui dans ce cas est le nom de fichier? – usertest

0

Je n'utilise php mais je

  1. créer une matrice pour contenir le nom de fichier et wordcount
  2. lire le dossier complet des fichiers texte et pour chaque enregistrement du nom de fichier et wordcount au
  3. tableau
  4. trier le tableau par wordcount
  5. sortie du réseau

Pour stocker l'information (# 2) je mettrais l'information dans un tableau 2D. Il y a plus d'informations sur les tableaux 2D here à Free PHP Tutorial. Ainsi, array [0] [0] équivaudrait au nom du premier fichier et le tableau 0 serait le wordcount. Le tableau 1 [0] et le tableau 1 correspondent au fichier suivant.

Pour trier le tableau (# 3), vous pouvez utiliser le tutoriel firsttube.com.

La sortie de I ferait une boucle dans le tableau et sortirait le premier et le second emplacement.

for ($i = 0; $i < sizeof($array); ++$i) { 
    print the filename ($array[$i][0]) and wordcount ($array[$i][1]) 
} 
+0

Mon problème est l'étape 3, comment puis-je stocker le nom du fichier et le compte ensemble pour la sortie plus tard? – usertest

+0

@ user201140 - vient d'ajouter plus d'informations à la réponse. Si vous avez des questions, n'hésitez pas à demander. – Kyra

0

Si vous souhaitez conserver l'approche de type itérateur (tout en faisant essentiellement la même chose que la réponse de Artefacto), alors quelque chose comme ce qui suit suffirait.

$dir_it = new FilesystemIterator("/tmp"); 
// Build array iterator with word counts 
$arr_it = new ArrayIterator(); 
foreach ($dir_it as $fileinfo) { 
    // Skip non-files 
    if (! $fileinfo->isFile()) continue; 
    $fileinfo->word_count = str_word_count(file_get_contents($fileinfo->getPathname())); 
    $arr_it->append($fileinfo); 
} 
// Sort by word count descending 
$arr_it->uasort(function($a, $b){ 
    return $b->word_count - $a->word_count; 
}); 

// Display sorted files and their word counts 
foreach ($arr_it as $fileinfo) { 
    printf("%10d %s\n", $fileinfo->word_count, $fileinfo->getFilename()); 
} 

Mis: Si les fichiers sont particulièrement importants (lire: charger chacun entièrement en mémoire juste pour compter les mots est trop) boucle vous pourriez alors sur la ligne par ligne fichier (ou byte-by-byte si vous voulez vraiment) avec le SplFileObject.

Questions connexes