2010-09-13 6 views
0

Ceci ci-dessous traverse les fichiers dans un répertoire, les lit et les enregistre dans des fichiers de 500 lignes max. un nouveau répertoire. Cela fonctionne très bien pour moi (merci Daniel), mais j'ai besoin d'une modification. Je souhaite enregistrer dans des fichiers alpha-numériques.PHP - trier les lignes alpha de plusieurs fichiers dans un répertoire et les enregistrer dans les fichiers de "x" max dans les dossiers alpha nommés

Tout d'abord, trier le tableau alpha numériquement (déjà en minuscules) serait la première étape que je suppose. Saisissez toutes les lignes dans chaque $ incoming. "/. Txt" qui commence par "a" et placez-les dans un dossier à $ save500. "/ A" mais un maximum de 500 lignes chacune. (Je suppose qu'il vaudrait mieux commencer par le premier en haut du tri donc "0" pas "a" non?)

Toutes les lignes commençant par un nombre, allez dans $ save500. "/ num ".

Aucune des lignes ne commencera avec autre chose que a-z0-9.

Cela me permettra de rechercher mes fichiers pour une correspondance plus efficace en utilisant cette méthode flatfile. Réduire à un dossier.

$nextfile=0; 
    if (glob("" . $incoming . "/*.txt") != false){ 
    $nextfile = count(glob("" . $save500 . "/*.txt")); 
    $nextfile++; 
    } 
    else{$nextfile = 1;} 
    /**/ 
    $files = glob($incoming."/*.txt"); 
    $lines = array(); 
    foreach($files as $file){ 
    $lines = array_merge($lines, file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES)); 
    } 
    $lines = array_unique($lines); 
    /*this would put them all in one file*/ 
    /*file_put_contents($dirname."/done/allofthem.txt", implode("\n", $lines));*/ 
    /*this breaks them into files of 500*/ 
    foreach (array_chunk($lines, 500) as $chunk){ 
    file_put_contents($save500 . "/" . $nextfile . ".txt", implode("\n", $chunk)); 
    $nextfile++; 
    } 

Chaque ligne doit toujours contenir au maximum 500 lignes.

Je vais passer à mysql plus tard. Cela fait seulement quelques mois maintenant.

Comme si cela ne suffisait pas. J'ai même pensé à enlever les deux premiers caractères. Faire des répertoires avec des subs a/0 à z/z!

Peut être la mauvaise approche ci-dessus depuis aucune réponse.

Mais je veux un mot comme aardvark enregistré dans le 1.txt le dossier a/a (en annexe). Sauf si 1.txt a 500 lignes, enregistrez-le dans un/2.txt. Donc, xenia serait ajouté au fichier 1.txt du dossier x/e à moins qu'il y ait 500 lignes, donc créez 2.txt et sauvegardez-le là.

Je serai alors en mesure de rechercher ces mots plus efficacement sans charger une tonne dans la mémoire ou en boucle à travers des fichiers/lignes qui ne contiendront pas de correspondance.

Merci à tous!

+0

Voir ma réponse, je l'ai mis à jour. – sled

Répondre

1

J'ai écrit un code ici qui devrait faire ce que vous cherchez, ce n'est pas une beauté de la performance, mais devrait faire l'affaire. Essayez-le dans un environnement sûr, aucune garantie pour toute perte de données;)

Commentaire s'il y a des erreurs, il est assez tard ici;) je dois aller dormir;)

NOTE: Celui-ci ne fonctionne si chaque ligne a au moins 2 caractères! ;)

$nextfile=0; 

if (glob("" . $incoming . "/*.txt") != false){ 
    $nextfile = count(glob("" . $save500 . "/*.txt")); 
    $nextfile++; 
} 
else 
{ 
    $nextfile = 1; 
} 



$files = glob($incoming."/*.txt"); 
$lines = array(); 
foreach($files as $file){ 
    $lines = array_merge($lines, file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES)); 
} 


$lines = array_unique($lines); 


/*this would put them all in one file*/ 
/*file_put_contents($dirname."/done/allofthem.txt", implode("\n", $lines));*/ 
/*this breaks them into files of 500*/ 

// sort array 
sort($lines); 

// outer grouping 
$groups  = groupArray($lines, 0); 
$group_keys = array_keys($groups); 

foreach($group_keys as $cKey) { 
    // inner grouping 
    $groups[$cKey] = groupArray($groups[$cKey], 1); 

    foreach($groups[$cKey] as $innerKey => $innerArray) { 
    $nextfile = 1; 
    foreach(array_chunk($innerArray, 500) as $chunk) { 
     file_put_contents($save500 . "/" . $cKey . "/" . $innerKey . "/" . $nextfile . ".txt", implode("\n", $chunk));  
     $nextfile++; 
    } 
    } 

} 


function groupArray($data, $offset) { 

    $grouped = array(); 

    foreach($data as $cLine) { 
    $key = substr($cLine, $offset, 1); 
    if(!isset($grouped[$key])) { 
     $grouped[$key] = array($cLine); 
    } 
    else 
    { 
     $grouped[$key][] = $cLine; 
    } 
    } 

    return $grouped; 
} 
+0

Merci. Je l'ai fait 16 heures 2 jours alors, je te sens. Je vais tester dans la matinée et de fournir mucho kudos je suis sûr. Merci donc mich ... –

+0

"appel non défini à grouparray() en ligne etc ..." (où il est appelé pour la première fois.) Donc j'ai mis en minuscules toutes les instances de groupArray et toujours la même erreur. EDIT- SORRY MY BAD - J'ai eu toute cette routine coincé dans un si (je veux exécuter ça) {cet extrait}. Continuera à tester. –

+0

cela devrait fonctionner.Je l'ai testé rapidement avec un tableau fictif, essayez de déplacer la fonction au sommet alors. Sinon, re-publier votre source. – sled

Questions connexes