使用PHP按姓氏对CSV文件进行排序

时间:2009-08-13 14:54:46

标签: php arrays csv sorting

如何使用PHP对以下CSV文件进行排序?我想按姓氏排序。我是否以某种方式使用正则表达式来获取姓氏中的第一个字母?任何帮助表示赞赏

以下是我的CSV文件的摘录 - 带有“;”名称和地址之间的分隔符

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

3 个答案:

答案 0 :(得分:3)

这是我的尝试。我不确定正则表达式在提取姓氏方面有多么强大。

<?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建议的那样)。如果这个人有更多带有空格的后缀,这可能会破坏,所以我会保留我的答案。

答案 1 :(得分:2)

好吧,因为它是一个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

答案 2 :(得分:0)

PHP函数array_multisort应该做你想要的。您需要将CSV读入多维数组 - 请参阅链接页面上的第三个示例。