2009-08-13 7 views
1

Comment trier le fichier CSV suivant en utilisant PHP? Je voudrais trier par nom de famille. Est-ce que j'utilise regex d'une façon ou d'une autre pour obtenir la première lettre du nom de famille? Toute aide est appréciéeTrier un fichier CSV par nom de famille avec PHP

Voici un extrait de mon fichier CSV - avec un ";" delimiter entre les noms et adresses

John C. Buckley, M.D.;123 Main Street, Bethesda MD 20816 
Steven P. Wood;345 Elm Street, Rockville, MD 20808 
Richard E. Barr-Fernandez;234 Pine Street, Takoma Park MD 20820 
Charles Andrew Powell; 678 Oak Street, Gaithersburg MD 20800 
Mark David Horowitz, III; 987 Wall Street, Silver Spring MD 20856 
+0

Combien de lignes dans CSV? –

+0

WTF .. il ne laisse pas ma réponse .... –

+0

Ça varie - certains sont plus de 2000 – Thomas

Répondre

3

Voici ma tentative. Je ne suis pas sûr à quel point le regex est robuste pour extraire le nom de famille.

<?php 
$handle = fopen('c:/csv.txt', 'r') or die('cannot read file'); 
$surnames = array(); 
$rows = array(); 

//build array of surnames, and array of rows 
while (false != ($row = fgetcsv($handle, 0, ';'))) { 
    //extract surname from the first column 
    //this should match the last word before the comma, if there is a comma 
    preg_match('~([^\s]+)(?:,.*)?$~', $row[0], $m); 
    $surnames[] = $m[1]; 
    $rows[] = $row; 
} 

fclose($handle); 

//sort array of rows by surname using our array of surnames 
array_multisort($surnames, $rows); 

print_r($rows); 
//you could write $rows back to a file here if you wanted. 

Modifier

Je viens de réaliser que vous n'avez pas vraiment besoin de dépouiller les peuples suffixes, parce que cela affecte probablement pas vraiment le tri. Vous pourriez juste diviser la première colonne sur l'espace et prendre le dernier (comme suggéré par karim79). Cela pourrait casser si la personne a plus de suffixes avec des espaces, donc je vais laisser ma réponse intacte.

+0

+1 @ Tom Haigh, je codais quelque chose comme ça, peut-être juste diviser à l'espace '' et prendre le dernier décalage du tableau résultant? Comme dans $ name = split ("", $ name); $ lastName = $ nom [nombre ($ name) - 1]; – karim79

+0

Tom, ça marche très bien. Vraie question stupide - comment puis-je simplement imprimer ou faire écho les lignes sur la page. Merci! – Thomas

+0

print_r() devrait déjà le faire. Vous pouvez imprimer sur une table si vous le souhaitez, cela devrait être un cas simple d'utiliser foreach pour parcourir le tableau et imprimer la valeur de chaque tableau 'sub'. –

0

La fonction PHP array_multisort doit faire ce que vous voulez. Vous aurez besoin de lire le CSV dans un tableau multidimensionnel - voir le troisième exemple sur la page liée.

+0

Que diriez-vous de trouver le nom de famille? – bmb

+0

Devinez j'ai raté cette partie, ma mauvaise. Vous avez déjà accepté une réponse mais la façon dont je le ferais est de diviser le nom sur un espace, prendre le dernier élément et l'ajouter à la "ligne" comme un nouvel élément. Puis trier sur ce champ. – DisgruntledGoat

2

Eh bien, parce qu'il est un fichier CSV

$lines = file($file); 
foreach($lines as $line) 
{ 
    $parts = explode(";", $line); 
    $last = explode(" ", $parts[0]); 
    $last = end($last); 
    $array[$last] = $parts; 
} 

ksort($array); 

// ..... write it back to file 
+0

Je pense que les données csv sont en fait séparées par des points-virgules, il semble que les virgules sont utilisées pour diviser les lignes d'adresse et aussi pour ajouter des suffixes de noms –

+0

Cela semble prometteur. J'ai changé le séparateur dans votre première fonction d'explosion en un point-virgule. Cependant, le tableau reste confus quand il prend la dernière partie du nom éclaté parce que certains noms se terminent par un "MD" ou "III" ou "Jr." – Thomas

+0

Dans l'exemple, le M.D était après le point-virgule, mais oui, pas exactement sûr comment vous corrigeriez cela. Je pourrais juste utiliser la 3ème valeur, mais si quelqu'un a plusieurs prénoms ou un espace dans leur premier ou deuxième prénom, il le rejettera. –

Questions connexes