2010-12-14 90 views
0

J'ai une grande quantité de données provenant d'un fichier csv qui ressemble à quelque chose comme ci-dessous.tri des données csv en fonction des occurrences de mots communs

url1, comment1 
url2, comment2 

Je dois trouver les mots entre les commentaires et trier les lignes en conséquence en fonction de l'apparition des mots sur chaque ligne.

Pour le moment je suis capable d'obtenir les mots communs mais je suis perdu quant à la façon de trier les lignes par mot commun sans épuiser la mémoire.

Voici mon code très inefficace.

$data = array(); 
while (($row = fgetcsv($fh, 1024, ',')) !== false) { 
    $data[] = $row[1]; 
} 

$str = preg_replace('/\s\s+/', ' ', trim(str_replace(array('!', '?', '.', ','), ' ', implode('', $data)))); 

$words = explode(" ", $str); 
var_dump(array_count_values($words)); 
+0

Si vous allez être couper/couper en dés la Les données CSV à plusieurs reprises, vous feriez mieux de le charger dans une base de données au lieu de le faire dans PHP. Le coût de chargement ponctuel serait compensé par la facilité avec laquelle l'exploration de données se fera une fois dans la base de données. –

+0

Merci, je vais essayer cette approche – madkris24

Répondre

1

charge les sons des données éclatées/mots dans la base de données comme une bonne idée,

OU vous pouvez essayer ceci:

$summary = array(); 
$data = array(); 
while (($row = fgetcsv($fh, 1024, ',')) !== false) 
{ 
    $data[] = $row[1]; 
    $str = preg_replace('/\s\s+/', ' ', trim(str_replace(array('!', '?', '.', ','), ' ', $row[1]))); 
    $words = explode(" ", $str); 
    foreach ($words as $word) 
    { 
    $word = strtolower($word); // lowercase to reduce variations 
    $summary[$word]++; 
    } 
} 
/* variable $summary will contains all your count */ 
/* take note on the size of $summary, could growth quite big */ 
+0

Y at-il une différence entre l'utilisation d'un tableau $ summary distinct et l'appel de array_count_values ​​($ words)? – madkris24

+0

votre méthode est de faire une comparaison sur csv entier (cycle d'exécution unique nécessite beaucoup de ressources), tandis que cette comparaison ligne par ligne est décomposée en plusieurs cycles d'exécution avec chaque cycle nécessitent de très petites ressources – ajreal

+0

ah cool merci! – madkris24