顿悟了R,excel将一去不返

作者: 小洁忘了怎么分身 | 来源:发表于2018-10-29 11:28 被阅读144次

    excel是最常用且功能强大的表格处理软件,但常规操作虽好,却不可重复!同样的表格,需要重复时就只能再搭上一倍的时间。

    还是卖U盘的烦恼,尽管找了第三方发货,我还是需要导出发货列表并整理,然后将他们返回给我的单号整理成批量发货要求的格式和样子。这两件事几乎每次需要耗费两小时!
    作为一个追求高效且强迫症的小员工,我已经想好了偷懒办法。

    微店导出发货列表,足足有51列!发货部门只需要姓名地址电话就够了!给别人提交信息时,绝不应该带废话。以前都是手动删除,虽然麻烦但也能完成。

    今天遇到了一个问题,我提交给发货部门的地址,他们要求分列,就是分出省、市、区、详细地址四列。

    要求是这样

    然而我们的收货地址导出是这样的:

    箭头所指是空格

    分列吗?首先想到tidyr里的separate

    但是问题来了,separate是有自己的小脾气的:

    • 如果不指定,就自动识别分隔符
    • 用into=c()参数定义的不仅是列名,还有列数。换言之,如果你的c()中有两个列名,那就是分成两列。
    • 那么如果你要分的单元格分出的数量与你定义的列数不同会怎么样?

    看下面的例子:

    原数据框
    不指定分隔符,指定分两列
    不指定分隔符,指定分三列

      因为没有定义分隔符,所以自动识别了空格和“.”都是分隔符。所以 K 0.7可以被分成3列!比你定义的列名多一列,所以多出来的那一列被丢弃了。如果你指定分三列,那么剩下两行分不出三列的,第三列就是NA。

    回到我的实际问题

    简而言之,我要分四列,却有5个空格分隔符。其实只是第一行有5个而已。后面几行也有有三个、四个、六个的。但有一个统一规律,地址都是省、市、区、详细地址。多出来的分隔符都在详细地址里。
    如果直接去分,得到的结果是这样的:


    后面的详细地址被丢弃了! 警告信息看下

    警告信息里说了,多出来的被丢弃了,少的被填上了NA。
      此处突然恍然大悟,为什么上次发货有几个通知我地址不全呢?之前没跟我说需要分列,所以直接把导出的地址交上了。后来出现地址不去,工厂告诉我是他们发货导出地址出了问题,一定就是这个原因啊!有空格,分列多出来的被丢弃了!

    倒霉的快递又是送到对应的城区,然后联系发货人补全地址,然后才给派送!要不就成了疑难件。吐槽ing,为啥没有仔细检查,快递为啥到了城区不能自己联系收件人问地址呢。

    但是呢。外包业务,不能要求太多。所以我今天探索了一个正确的做法,哦耶。
    既然你空格太多,而我只要前三个,那就把前三个空格换成“。”,再指定分隔符为“。”不就可以啦!(这个分隔符可以自己改,就是注意不能是地址里已经有的)
    然后我就用到了昨天刚学到的正则表达式-替换匹配的内容,刚记住了正则表达式默认一个字符串只匹配第一个。既然要换三个,那就来三次吧!

    str_replace(),结合我用的非常顺手的dplyr那就可以咯。不过这里是我自己想出来的,应该还是算个笨办法,以后有学到新方法再来改进!

    #正则表达式尝试
    library(tidyverse)
    library(stringr)
    library(xlsx)
    #读取微店导出的表格
    fhddh1 <- readxl::read_xls('fhddh1.xls')
    
    fhddh1_s <- fhddh1 %>%
      select('收件人姓名',
             '收件人手机',
             '收货详细地址')
    
    fhddh1_s2 <- fhddh1_s %>%
      mutate('adress1'=
               as.vector(str_replace(fhddh1_s$收货详细地址,
                                     " ", "。"))) %>%
      mutate('adress2'=
               as.vector(str_replace(adress1,
                                     " ", "。")))%>%
      mutate('adress3'=
               as.vector(str_replace(adress2,
                                     " ", "。")))%>%
      select(-3,-4,-5)%>%
      separate(adress3,into = c('省','市','区','详细地址'),sep="。")
    
    write.xlsx(fhddh1_s2,'10.29发货地址.xls')
    #这个表格发给发货部门,去掉一切冗余信息。
    fhddh1_ssd <- fhddh1 %>%
      select('订单编号','收件人姓名')
    write.xlsx(fhddh1_ssd,'10.29发货订单号.xls')
    #这个表格我留样,等他们返回发货单号,我就用收件人姓名这一列来left_join。
    #因为批量发货的唯一依据是订单号!
    
    批量发货模板

    所以返回发货单号后,再来这个脚本就大功告成,直接导出了微店批量发货要求的xlsx格式。

    library(tidyverse)
    library(stringr)
    library(xlsx)
    #物流单号表格,有收件人和单号信息
    dh <- readxl::read_xls('dh.xls')
    #订单号表格
    id <- readxl::read_xls('10.29发货订单号.xls')
    
    pl <- left_join(dh,id,by='收件人姓名')%>%
      mutate('物流公司'='中通速递','买家确认收货时间'='7天')%>%
      select('订单号','物流公司','物流单号','买家确认收货时间')
    write.xlsx(p1,'10.29批量发货.xlsx')
    

    大功告成!

    相关文章

      网友评论

      • PowerQuery:不懂R,不过可以试试看微软的powerquery,功能强大,清洗数据大部分操作都可以在界面完成,包括示例中的分列。
        小洁忘了怎么分身:@空心芥 界面是别人设计好的,有很多限制。会代码才更好。

      本文标题:顿悟了R,excel将一去不返

      本文链接:https://www.haomeiwen.com/subject/qkovtqtx.html