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')
大功告成!
网友评论