Как я могу отсортировать следующий файл CSV с помощью PHP? Я хотел бы отсортировать фамилию. Я как-то использую regex, чтобы получить первую букву от фамилии? Любая помощь приветствуется
Вот выдержка из моего файла CSV – с ";" разделитель между именами и адресами
John C. Buckley, MD;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
Вот моя попытка. Я не уверен, насколько надежным является регулярное выражение для извлечения фамилии.
<?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.
редактировать
Я просто понял, что вам действительно не нужно удалять суффиксы людей, потому что это, вероятно, не повлияет на сортировку. Вы можете просто разбить первый столбец на пробел и взять последний (как предложил karim79). Это может сломаться, если у человека больше суффиксов с пробелами, поэтому я оставлю свой ответ неповрежденным.
Ну, потому что это 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
Функция PHP array_multisort должна делать то, что вы хотите. Вам нужно будет прочитать CSV в многомерном массиве – см. Третий пример на связанной странице.