2010-10-06 8 views
2

J'ai donc un énorme fichier de noms qui doit être divisé en plusieurs colonnes pour Excel.Suggestions pour analyser ces données

Je me sers de PHP pour analyser ce, alors voici fait partie de l'exemple:

Dr. Johnny Apple Seed 
Ms. A. P. Oranges 
Mrs. Purple Cup 

Essentiellement, je veux mettre cela dans un tableau. J'utilisais fopen, fget et exploser. Le problème est, si j'utilise exploser, certains des tableaux n'auraient pas d'éléments cohérents. Par exemple, le premier aurait un total de 4 (Dr, Johnny, Apple, Seed), le troisième n'en aurait que trois. Comment pourrais-je ajouter un quatrième élément vide entre le violet et la tasse? ou y a-t-il un meilleur moyen?

Ceci est mon code:

$fp = fopen($filename,"r"); 

if ($fp) { 
    while (!feof($fp)) { 
    $data = fgets($fp, filesize($filename)); 
    $contents[] = explode(" ", $data) . 
    } 

} 

fclose($fp); 
echo "<pre>"; 
var_dump($contents); 
echo "</pre>"; 

sortie souhaitée:

array(4) { 
    [0]=> 
    string(4) "Mrs." 
    [1]=> 
    string(4) "Purple" 
    [2]=> 
    string(1) " " 
    [3]=> 
    string(8) "Cup" 

array(4) { 
    [0]=> 
    string(3) "Dr." 
    [1]=> 
    string(6) "Johnny" 
    [2]=> 
    string(5) "Apple" 
    [3]=> 
    string(4) "Seed" 
+1

si quelqu'un a> 3 noms, sans compter le titre? Pourriez-vous ajouter un exemple de sortie souhaité? –

+0

Ajout d'un exemple de sortie souhaité. – Strawberry

Répondre

0

J'utilisé array_splice, voici ma solution:

<?php 

$filename = "excel-names.txt"; 
$fp = fopen($filename,"r"); 

if ($fp) { 
    while (!feof($fp)) { 
     $data = fgets($fp, filesize($filename)); 
     $contents[] = explode(" ", $data, 4); 
    }  
} 

fclose($fp); 

foreach($contents as $a) { 
    $arrayCount = count($a); 

    if($arrayCount == 3) { 
     array_splice($a, 2, 0, " "); 
    } 
    if($arrayCount == 2) { 
     array_splice($a, 0, 0, " "); 
     array_splice($a, 2, 0, " "); 
    } 
} 

?> 
+0

Vous itérez aussi deux fois l'ensemble de données - une fois lorsque vous avez lu le fichier et une fois de plus sur le tableau '$ contents'. Bien que cela puisse faire le travail, je ne le recommanderais pas vraiment, surtout lorsque vous travaillez avec des fichiers très volumineux comme si c'était votre cas. De toute façon, heureux que vous l'ayez résolu :) –

+0

Sagesse reconnue. Comment changeriez-vous ma source? Pourrais-tu me montrer? – Strawberry

0

Si elles sont nouvelles lignes, vous pouvez utiliser "\ n" comme l'aiguille de $

1

Essayez ceci (n'ont pas testé mais devraient fonctionner):

// Define the clean array 
$clean_array = array(); 

$fp = fopen($filename,"r"); 
if ($fp) { 
    while (!feof($fp)) { 
     $data = fgets($fp, filesize($filename)); 
     // use trim() on $data to avoid empty elements 
     $contents = explode(" ", trim($data)); 

     if (count($contents) == '3') { 
      // Copy last element to new last element 
      $contents[] = $contents[2]; 
      // Clear the old last element 
      $contents[2] = ' '; 
     } 
     $clean_array[] = $contents; 
    } 
} 
fclose($fp); 

echo '<pre>'; 
print_r($clean_array); 
echo '</pre>'; 

J'espère que cela aide.

1

Cela devrait fonctionner:

<?php 
$new_array = array(); 
$fp = fopen($filename, "r"); 
if ($fp) { 
    while (!feof($fp)) { 
     $data = fgets($fp, filesize($filename)); 
     $contents[] = explode(" ", $data); 
    } 
} 
foreach ($contents as $content) { 
    if (count($content) != 4) { 
     $content[3] = $content[2]; 
     $content[2] = " "; 
     $new_array[] = $content; 
    } 
    else { 
     $new_array[] = $content; 
    } 
} 
fclose($fp); 
echo "<pre>"; 
var_dump($new_array); 
echo "</pre>"; 
?> 
+0

Quel est le point de boucler deux fois sur ce qui est essentiellement les mêmes données? –

+0

Mon erreur, cela peut être fait en une seule fois ... – Wolfy

Questions connexes