Использование регулярных выражений для исправления телефонных номеров в CSV с PHP - PullRequest
2 голосов
/ 02 апреля 2010

Мой новый телефон не распознает номер телефона, если его код города не соответствует входящему вызову. Поскольку я живу в штате Айдахо, где для звонков внутри штата код города не нужен, многие мои контакты были сохранены без кода города. Поскольку в моем телефоне хранятся тысячи контактов, обновлять их вручную нецелесообразно. Я решил написать следующий PHP-скрипт для решения этой проблемы. Кажется, это работает хорошо, за исключением того, что я нахожу дубликаты кодов регионов в начале случайных контактов.

 <?php
//the script can take a while to complete
set_time_limit(200);

function validate_area_code($number) {
    //digits are taken one by one out of $number, and insert in to $numString
    $numString = "";
    for ($i = 0; $i < strlen($number); $i++) {
        $curr = substr($number,$i,1);
        //only copy from $number to $numString when the character is numeric
        if (is_numeric($curr)) {
            $numString = $numString . $curr;
        }
    }
    //add area code "208" to the beginning of any phone number of length 7
    if (strlen($numString) == 7) {
        return "208" . $numString;
    //remove country code (none of the contacts are outside the U.S.)
    } else if (strlen($numString) == 11) {
        return preg_replace("/^1/","",$numString);
    } else {
        return $numString;
    }
}
//matches any phone number in the csv
$pattern = "/((1? ?\(?[2-9]\d\d\)? *)? ?\d\d\d-?\d\d\d\d)/";
$csv = file_get_contents("contacts2.CSV");
preg_match_all($pattern,$csv,$matches);


foreach ($matches[0] as $key1 => $value) {
    /*create a pattern that matches the specific phone number by adding slashes before possible special characters*/
    $pattern = preg_replace("/\(|\)|\-/","\\\\$0",$value);

    //create the replacement phone number
    $replacement = validate_area_code($value);

    //add delimeters 
    $pattern = "/" . $pattern . "/";

    $csv = preg_replace($pattern,$replacement,$csv);
}
echo $csv;

?>

Есть ли лучший подход к модификации CSV? Кроме того, есть ли способ минимизировать количество проходов через CSV? В приведенном выше сценарии preg_replace вызывается тысячи раз для очень большой строки.

Ответы [ 3 ]

2 голосов
/ 02 апреля 2010

Если я вас правильно понимаю, вам просто нужно добавить код города к любому 7-значному номеру телефона в любом месте этого файла, верно? Я понятия не имею, на какой системе вы работаете, но если у вас есть приличные инструменты, вот несколько вариантов. И, конечно же, подходы, которые они используют, по-видимому, могут быть реализованы в PHP; это просто не один из моих языков.

Итак, как насчет sed-liner? Просто найдите 7-значный номер телефона, ограниченный либо началом строки, либо запятой слева, а запятой или концом строки справа.

sed -r 's/(^|,)([0-9]{3}-[0-9]{4})(,|$)/\1208-\2\3/g' contacts.csv

Или, если вы хотите применить его только к определенным полям, perl (или awk) будет проще. Предположим, это второе поле:

perl -F, -ane '$"=","; $F[1]=~s/^[0-9]{3}-[0-9]{4}$/208-$&/; print "@F";' contacts.csv

-F, указывает на разделитель полей, $" - это разделитель выходных полей (да, он присваивается один раз за цикл, ну да ладно), массивы индексируются нулями, поэтому второе поле равно $F[1] обычная замена, и вы печатаете результаты.

0 голосов
/ 05 апреля 2010

Немного больше копания самостоятельно выявило проблемы с регулярным выражением в моем вопросе. Проблема с дублирующимися контактами в CSV.

Пример: (208) 555-5555, 555-5555

После первого прохода становится:

2085555555, 208555555

и после второго прохода становится 2082085555555, 2082085555555

Я решил эту проблему, изменив регулярное выражение на:

//add escapes for special characters
$pattern = preg_replace("/\(|\)|\-|\./","\\\\$0",$value);
//add delimiters, and optional area code
$pattern = "/(\(?[0-9]{3}\)?)? ?" . $pattern . "/";
0 голосов
/ 02 апреля 2010

А-а ... иногда лучше 10-минутный хак.
Если бы это был я ... Я бы импортировал CSV-файл в Excel, отсортировал бы его по чему-нибудь - возможно, по длине телефонного номера или как-то так.,Сделайте новый col для фиксированного номера телефона.Если у вас есть группа одинаково загрязненных чисел, составьте формулу для исправления.То же самое для следующей группы.Должно быть довольно быстро, нет?Затем снова экспортируйте в .csv, не используя плохой столбец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...