程序代码园发文地址:SQL Server 根据文件名称在ERP系统里面获取门店名称-程序代码园
在工作中遇到,门店的POS数据需要根据ERP的门店名称导入到系统里面,之前写的导入方法不是很好,复制粘贴的工作量太大了(将回传回来的POS数据文件加上正确的门店名称,中间用特殊标志字段“byq”隔开,虽然已经用批处理的办法批量去修改文件名称,但是复制粘贴的工作量还是很大);还好回传回来的POS数据文件名称上已经有门店名称的关键信息;
问题描述:
之前的导入程序,需要提前处理文件上的门店名称,但是工作量太大了(复制,粘贴)
解决思路:
利用SQL Server 工具处理,把文件名称批量读取出来后导入数据库里面,结合ERP系统里面的门店信息表,取最相似的门店名称。
技术要点:
1、批量获取文件名称
2、获取相似度最高的方法
3、文件名称中会有一些多余的数据干扰判断的处理方法
4、通过文件名称获取相似度最高的方法
5、循环通过文件名称获取相似度最高的门店名称
6、批量更新文件名称
第一步:1、批量获取文件名称
用批处理的命令,获取文件名称在一个Excel表格里面,代码如下:
执行批处理的文件:readFileName.bat;处理后的结果放到Excel文件中:readFileName.xls
dir /b>readFileName.xls
第二步:获取相似度最高的方法
在数据库里面新建一个方法“FN_Resemble”,用于比较2个字符串的相似度(这里就简认为:字符串1中的字符在字符串2出现的次数,出现的越多越相似,网上参考写法),该方法返回相似度,代码如下:
---两个字段简单相似
ALTER FUNCTION [dbo].[FN_Resemble]
(@Cloumna NVARCHAR(MAX),
@Cloumnb NVARCHAR(MAX)
)
RETURNS FLOAT
AS
BEGIN
DECLARE @num FLOAT,@len int
SET @Cloumna=ISNULL(@Cloumna,0)
SET @Cloumnb=ISNULL(@Cloumnb,0)
SET @len=1
SET @num=0
WHILE(LEN(@Cloumna)<>0 AND LEN(@CloumnB)<>0)
BEGIN
WHILE(@len<=LEN(@Cloumna))
BEGIN
DECLARE @a NVARCHAR(4)
SET @a=''
SET @a=SUBSTRING(@Cloumna,@len,1)
IF(CHARINDEX(@a,@CloumnB)>0)
BEGIN
SET @num=@num+1
END
SET @len=@len+1
END
SET @num=@num*1.0/LEN(@Cloumna)
BREAK
END
RETURN @num
END
第三步:文件名称中会有一些多余的数据干扰判断的处理方法
在数据库里面新建一个方法“fn_getSimpleFilename”,将文件名称里面干扰获取最高相似度的信息全部处理掉,这里用到的是替换,代码如下:
ALTER FUNCTION [dbo].[fn_getSimpleFilename]
(
@FileName varchar(200)
)
RETURNS varchar(200)
AS
BEGIN
set @FileName = REPLACE(@FileName, '1', '')
set @FileName = REPLACE(@FileName, '2', '')
set @FileName = REPLACE(@FileName, '3', '')
set @FileName = REPLACE(@FileName, '4', '')
set @FileName = REPLACE(@FileName, '5', '')
set @FileName = REPLACE(@FileName, '6', '')
set @FileName = REPLACE(@FileName, '7', '')
set @FileName = REPLACE(@FileName, '8', '')
set @FileName = REPLACE(@FileName, '9', '')
set @FileName = REPLACE(@FileName, '0', '')
set @FileName = REPLACE(@FileName, '年', '')
set @FileName = REPLACE(@FileName, '月', '')
set @FileName = REPLACE(@FileName, '日', '')
set @FileName = REPLACE(@FileName, '份', '')
set @FileName = REPLACE(@FileName, '销量', '')
set @FileName = REPLACE(@FileName, '集鑫隆', '')
set @FileName = REPLACE(@FileName, '纸业', '')
set @FileName = REPLACE(@FileName, '店', '')
set @FileName = REPLACE(@FileName, '一', '')
set @FileName = REPLACE(@FileName, '二', '')
set @FileName = REPLACE(@FileName, '三', '')
set @FileName = REPLACE(@FileName, '线', '')
set @FileName = REPLACE(@FileName, '商品', '')
set @FileName = REPLACE(@FileName, '销售', '')
set @FileName = REPLACE(@FileName, '汇总', '')
set @FileName = REPLACE(@FileName, '报表', '')
set @FileName = REPLACE(@FileName, '毛利', '')
set @FileName = REPLACE(@FileName, '明细', '')
set @FileName = REPLACE(@FileName, '超市', '')
set @FileName = REPLACE(@FileName, '集', '')
set @FileName = REPLACE(@FileName, '类', '')
set @FileName = REPLACE(@FileName, '家清', '')
set @FileName = REPLACE(@FileName, '纸品', '')
set @FileName = REPLACE(@FileName, '统计', '')
set @FileName = REPLACE(@FileName, '数据', '')
set @FileName = REPLACE(@FileName, 'POS', '')
set @FileName = REPLACE(@FileName, '化妆品', '')
set @FileName = REPLACE(@FileName, '(', '')
set @FileName = REPLACE(@FileName, ')', '')
set @FileName = REPLACE(@FileName, '-', '')
set @FileName = REPLACE(@FileName, '_', '')
set @FileName = REPLACE(@FileName, ' ', '')
set @FileName = REPLACE(@FileName, '.xls', '')
set @FileName = REPLACE(@FileName, '.', '')
RETURN @FileName
END
第四步:通过文件名称获取相似度最高的方法
在写一个方法“fn_getSimilarity”,通过该方法循环上一步方法将文件名称和ERP门店名称比较,最终获取相似度的门店名称,返回门店名称,代码如下:
-- 获取文件名称和门店名称匹配度最高的
ALTER FUNCTION [dbo].[fn_getSimilarity]
(
@FileName varchar(200),
@FDeptName varchar(200)
)
RETURNS varchar(200)
AS
BEGIN
declare @FCustomerName VARCHAR(200)
-- 根据分公司取门店名称
declare @c_tbd_Customer table(
id int IDENTITY
,FCustomerName VARCHAR(200)
,Similarity float(10)
)
insert into @c_tbd_Customer(FCustomerName)
select FCustomerName from c_tbd_Customer_ERP where FDeptName = @FDeptName
DECLARE @count int
select @count = (select count(*) from @c_tbd_Customer)
-- 获取相似度最高的门店名称
declare @i int,@FCustName VARCHAR(200),@Similarity float(10)
set @i = 1
while @i< @count + 1
-- 拼接sql
begin
set @FCustName = (select FCustomerName from @c_tbd_Customer where id = @i)
set @Similarity = (SELECT dbo.FN_Resemble(@FileName,@FCustName))
update @c_tbd_Customer set Similarity = @Similarity where id = @i
set @i = @i + 1
end
set @FCustomerName = (select top 1 FCustomerName from @c_tbd_Customer order by Similarity desc)
RETURN @FCustomerName
END
第五步:循环通过文件名称获取相似度最高的门店名称
新建一个存储过程,将前面通过批处理获取到的文件导入数据库中,循环执行上一步的方法获取文件名称对应的最高相似度的门店名称,返回每个文件名称对应的最高相似度的门店名称,代码如下:
ALTER PROCEDURE [dbo].[a_jxl_getSimilarity]
@FDeptName varchar(200)
AS
BEGIN
set nocount on
-- 删除无效数据
delete a_jxl_FileName_FCustomerName where FileName is null
create table #message(
id int IDENTITY
, message NVARCHAR (255)
, flag varchar(255)
)
create table #a_jxl_FileName_FCustomerName(
id int IDENTITY
, FileName NVARCHAR (255)
, SimpleFilename NVARCHAR (255)
, FCustomerName NVARCHAR (255)
)
insert into #a_jxl_FileName_FCustomerName(FileName)
select FileName from a_jxl_FileName_FCustomerName
DECLARE @count int,@i int,@FileName VARCHAR(200)
select @count = (select count(*) from a_jxl_FileName_FCustomerName)
-- 获取处理过的文件名称
declare @SimpleFilename VARCHAR(200)
set @i = 1
while @i< @count + 1
-- 拼接sql
begin
set @FileName = (select FileName from #a_jxl_FileName_FCustomerName where id = @i)
set @SimpleFilename = (SELECT dbo.fn_getSimpleFilename (@FileName))
update #a_jxl_FileName_FCustomerName set SimpleFilename = @SimpleFilename where id = @i
set @i = @i + 1
end
-- 获取相似度最高的客户名称
declare @FCustomerName VARCHAR(200)
set @i = 1
while @i< @count + 1
-- 拼接sql
begin
set @SimpleFilename = (select SimpleFilename from #a_jxl_FileName_FCustomerName where id = @i)
set @FCustomerName = (SELECT dbo.fn_getSimilarity (@SimpleFilename,@FDeptName))
update #a_jxl_FileName_FCustomerName set FCustomerName = @FCustomerName where id = @i
set @i = @i + 1
end
select id ,FileName ,FCustomerName,SimpleFilename from #a_jxl_FileName_FCustomerName
delete a_jxl_FileName_FCustomerName
drop table #message
drop table #a_jxl_FileName_FCustomerName
set nocount off
END
第六步:批量更新文件名称
将上一步的结果,文件名称和门店名称,复制粘贴到第一步新建的Excel文件中,写Excel公式形成批处理命令,公式如下:
="ren "&A1&" "&B1&"byq"&A1
将形成批处理命令,复制粘贴到批处理文件“WrightNewFileName.bat”中,保存,双击执行批处理就可以批量更新文件名称
程序代码园发文地址:SQL Server 根据文件名称在ERP系统里面获取门店名称-程序代码园