格式化R中的电话号码

时间:2016-01-05 16:25:32

标签: r if-statement gsub

所以我有一个没有标准格式的电话号码列表,因此它们可以是(123)-456-7890,1234567890,456890,456-7890。

我想查看我的电话号码列表并将其格式化为 123-456-7890 456-7890

到目前为止我在R中所拥有的是

targetdir

但我收到错误 - 有什么想法吗?

我希望输出的长度为10的电话号码格式为123-456-7890,对于长度为7的电话号码,格式为123-4567。对于无效条目,应删除这些条目。

谢谢!!!

2 个答案:

答案 0 :(得分:4)

以Eric的答案为基础并尝试将所有部分组合在一起,我认为这就是我要做的事情。

关键步骤是

  1. 删除所有标点符号。此时,一切都应该是数字或字符值。
  2. 将所有非7位或10位数的电话号码设置为NA(或您选择的其他值)
  3. 重新格式化7位数字
  4. 重新格式化10位数字。
  5. 我尝试了一些不同的方法,但这个方法似乎效率最高。

    /**
     * @Route("/edit/{id}", name="edit_object")
     * @ParamConverter("object", class="ObjectBundle:Object")
     * @Template()
     */
    public function editAction(Object $object, Request $request)
    {
        $form = $this->createForm(new ObjectType(), $object, array(
            'action' => $this->generateUrl('edit_object',['id' => $object->getId()]),
            'method' => 'POST'));
    
        $form->handleRequest($request);
    
        if ($form->isValid() && $form->isSubmitted()) {
    
            $em = $this->getDoctrine()->getManager();
            $em->persist($object);
            $em->flush();
    
            return $this->render('@Object/Object/list.html.twig', array(
                'object' => $object));
        }
        return array('collection'=>$collection, 'form' => $form->createView());
    }
    

答案 1 :(得分:1)

像这样,

p <- c("(123)-456-7890", "1234567890", "456890  ", "456-7890", "   (123)-4567890")
p
# >[1] "(123)-456-7890"   "1234567890"       "456890  "         "456-7890"        
# >[5] "   (123)-4567890"
p <- trimws(gsub("[[:punct:]]", "", p))
# > # p <- gsub("[-,),(]", "", p) ) # altrenative, but does not remove whitespace!
p
# >[1] "1234567890" "1234567890" "456890"     "4567890"    "1234567890"
p[!nchar(p) %in% c(10)] <- NA
p
# >[1] "1234567890" "1234567890" NA           NA           "1234567890"
p <- gsub("(^\\d{3})(\\d{3})(\\d{4}$)", "\\1-\\2-\\3", p)
p
# >[1] "123-456-7890" "123-456-7890" NA             NA             "123-456-7890"
p <- p[!is.na(p)] # to remove NA's
p
# >[1] "123-456-7890" "123-456-7890" "123-456-7890"