2009-07-27 8 views
2

Je suis en train de créer un script qui va ouvrir un fichier texte enregistré, exporter le contenu dans un tableau, puis vider le contenu dans une base de données. Jusqu'à présent, j'ai été en mesure de faire fonctionner le téléchargement de fichiers tout à fait heureusement et peut également ouvrir ledit fichier. Le problème que j'ai est le contenu du fichier est variable, ils ont une structure fixe, mais le contenu va changer à chaque fois. La structure du fichier est que chaque "section" est séparée par une ligne vide.fonction php pour diviser un tableau à chaque ligne vide?

J'ai utilisé le fichier php() pour obtenir un tableau ... Je ne suis pas sûr s'il existe un moyen de diviser ce tableau à chaque fois qu'il rencontre une ligne vide?

$file = $target_path; 
    $data = file($file) or die('Could not read file!'); 

sortie Exemple:

[0] => domain.com 
[1] => # Files to be checked 
[2] => /www/06.php 
[3] => /www/08.php 
[4] => 
[5] => domain2.com 
[6] => # Files to be checked 
[7] => /cgi-bin/cache.txt 
[8] => /cgi-bin/log.txt 
[9] => 
[10] => domain3.com 
[11] => # Files to be checked 
[12] => /www/Content.js 
[13] => 

Je sais que le terrain 0 et 1 seront constantes, ils seront toujours un nom de domaine, cette ligne de hachage. Les lignes par la suite pourraient être n'importe où entre 1 ligne et 1000 lignes. J'ai regardé array_chunk() qui est proche de ce que je veux, mais cela fonctionne sur une valeur numérique, ce qui serait bien s'il y avait quelque chose qui fonctionnerait sur une valeur spécifiée (comme une nouvelle ligne, ou un virgule ou quelque chose de ce genre!).

Enfin, je vous prie de m'excuser si cela a déjà été répondu. J'ai cherché les endroits habituels quelques fois pour des solutions potentielles.

Espoir vous pouvez aider :) Foxed

Répondre

1

Vous pourriez juste faire quelque chose comme ceci. Vous pouvez également le modifier pour lire le fichier ligne par ligne plutôt que d'utiliser file(), qui utiliserait moins de mémoire, ce qui pourrait être important si vous utilisez des fichiers plus volumineux.

$handle = fopen('blah', 'r'); 
$blocks = array(); 
$currentBlock = array(); 
while (!feof($handle)) { 
    $line = fgets($handle); 
    if (trim($line) == '') { 
     if ($currentBlock) { 
      $blocks[] = $currentBlock; 
      $currentBlock = array(); 
     } 
    } else { 
     $currentBlock[] = $line; 
    } 
} 
fclose($handle); 
//if is anything left 
if ($currentBlock) { 
    $blocks[] = $currentBlock; 
} 

print_r($blocks); 
+0

Qui l'a craqué. Première fois :) - Merci à toutes les autres réponses, celui-ci a résolu le problème. – suitedupgeek

+0

pourrait résoudre l'astuce, mais est certainement le moins efficace.Wesley avait un très bon point sur l'utilisation de file_get_contents(). –

+0

Vous ne pensez qu'au CPU. Si le fichier est dit 1Gb, alors file_get_contents() et convertissant cela en un tableau aura une utilisation de la mémoire crête beaucoup plus élevée. Je pense que cela vaut également la peine d'être considéré. –

1

Avez-vous essayé split ('\ n \ n', $ file); ?

+0

Sûrement split() fonctionne sur les cordes, il parle de travailler sur un tableau de chaînes. –

+0

C'est la même chose que j'ai posté :), mais @ ce que Wesley a dit – Dirk

0

Vous pouvez le faire en séparant d'abord sur la ligne blanche puis sur les nouvelles lignes, par exemple:

$file = $target_path; 
$fileData = file_get_contents($file) or die('Could not read file!'); 
$parts = explode("\n\n", $data); 
$data = array(); 
foreach ($parts as $part) { 
    $data[] = explode("\n", $part); 
} 

Vous pouvez également utiliser preg_split() à la place de la première explosion() avec une expression rationnelle sp .lit sur les lignes contenant juste des espaces (ex: \ s +)

3

Je pense que ce que vous cherchez est preg_split. Si vous venez de diviser un retour chariot, vous risquez de manquer des lignes contenant uniquement des espaces ou des tabulations.

$output = array(...);//what you just posted 
$string_output = implode('', $output); 
$array_with_only_populated_lines = preg_split('`\n\W+`', $string_output); 
+0

note que le regex réel affiché ci-dessus n'a fonctionné que dans l'exemple factice dont j'ai joui avant de poster. vous devrez peut-être faire quelques ajustements si cela ne correspond pas à vos objectifs. –

+0

Plutôt que de faire file(), implode(), preg_split(), vous pouvez utiliser file_get_contents() à la place. –

1

J'utiliser la fonction preg_grep() pour réduire le tableau résultant:

$array = preg_grep('/[^\s]/', $array); 
Questions connexes