2015-01-08 16 views
0

我有一个非常有趣的数据集,是由一位同事提供给我的。数据集在SQL Server 2014中。我在那里有一个名为'用户'的表格,列名为Address。地址的格式是一个烂摊子:重新格式化单个杂乱的列

|Address | |-------------------------------------------------|----------------------- |9, Layman drive, Paris, 32432 | |Layman drive, Paris, 9832, #AALM,43 | |Layman drive, Paris, 33, #AM,1 | |11, Layman drive, Paris | |12, Layman drive, Paris | |-------------------------------------------------|-----------------------

我试图重新安排所有按以下格式的地址项目:

[地址编号],[街],[市],[邮编]

9,外行车道,巴黎,32432

同时我需要摆脱人物像这个:'#AALM,43'

任何人都知道我可以从哪里开始?

谢谢。

+0

我会用像C#而不是SQL的其他工具清理它。但即使如此,还不清楚是否有可能。这真是一团糟。似乎没有任何规则。 –

+0

我总是喜欢在修复过去之前修复未来。在这种情况下,请采取措施确保新记录具有所需的格式。事实上,我会去分开的领域。此外,您所需的格式不考虑公寓号码。 –

+1

这看起来像一个正则表达式的工作。 – eebbesen

回答

2

在过去完成像这样的清理工作之后,您肯定希望分块执行某些操作,特别是直接从SQL执行操作,例如通过SQL查询界面。

我会先修改您的表格结构并添加您需要的额外列 - 另外添加到“workingAddress”的EXTRA列(或在您的查询中缩写为“wadr”)。

然后,所有的地址列值复制到临时工作地址栏,所以我们不破坏原来的一个...

update yourTable set wadr = Address; 

然后,工作一种成分的时间和这样做...

update yourTable 
    set [Address Number] = LTRIM(RTRIM(LEFT(wadr, CHARINDEX(',', wadr) -1))) 
    where CHARINDEX(',', wadr) > 1; 

然后,只保留那些地址数的只是数字表示

update yourTable 
    set [Address Number] = '' 
    where LTRIM(RTRIM(STR(cast([Address Number] as Integer), 6))) = RTRIM([Address Number]); 
现在210

,对于那些都成功控制,

update yourTable 
    set wadr = LTRIM(RTRIM(SUBSTR(wadr, CHARINDEX(',', wadr) +1, 60))) 
    where LEN(RTRIM([Address Number])) > 0; 

所以现在从工作地址栏去掉,你的地址号码(如果存在)会在你的[地址编号]列,这个数字已被剥夺从“WADR”栏,并修剪成仅一街之...现在,过程街道:

update yourTable 
    set [Street] = LTRIM(RTRIM(LEFT(wadr, CHARINDEX(',', wadr) -1))) 
    where CHARINDEX(',', wadr) > 1; 

而且从工作地址栏剥离街道

update yourTable 
    set wadr = LTRIM(RTRIM(SUBSTR(wadr, CHARINDEX(',', wadr) +1, 60))) 
    where LEN(RTRIM([Street])) > 0; 

现在到城市,然后剥离市地方发现...

update yourTable 
    set [City] = LTRIM(RTRIM(LEFT(wadr, CHARINDEX(',', wadr) -1))) 
    where CHARINDEX(',', wadr) > 1; 

而且从工作地址栏

update yourTable 
    set wadr = LTRIM(RTRIM(SUBSTR(wadr, CHARINDEX(',', wadr) +1, 60))) 
    where LEN(RTRIM([City])) > 0; 

最后你的邮政编码......这可能剥离街道是2个条件...如果没有逗号,只需抓住可能留下的任何东西......您的一些示例数据没有邮政编码。这将首先从wadr获取邮政编码,然后清除wadr列,如果没有更多的逗号。

update yourTable 
    set [Postcode] = wadr, 
     wadr = '' 
    where CHARINDEX(',', wadr) < 1; 

现在,对于那些有一个邮政编码和其他的东西(你的垃圾末),只要抓住之前的逗号像早期的情况下

update yourTable 
    set [Postcode] = LTRIM(RTRIM(LEFT(wadr, CHARINDEX(',', wadr) -1))) 
    where CHARINDEX(',', wadr) > 1; 

update yourTable 
    set wadr = LTRIM(RTRIM(SUBSTR(wadr, CHARINDEX(',', wadr) +1, 60))) 
    where LEN(RTRIM([Postcode])) > 0; 

在年底无论是,你的“wadr”列应该是空白的,或者只是最后的垃圾内容。语法可能需要调整一些,但应该做的伎俩......一旦这些都很好去,确认事情看起来不错,你可以删除“wadr”列,如果你想,最终杀死“地址”柱。

+0

为此付出了很多努力(要么OP会使用它,要么拿一些东西从它)+ 1 – HaveNoDisplayName

+0

@Piyush,是的,但在过去做清洗,并没有破坏原始值,你仍然需要做某种解析/分裂......如果不是做regEx或写一个完整的C#应用​​程序转换和更新,这将是一次性清理并丢弃。 – DRapp

+0

同意你的意见! @DRapp – HaveNoDisplayName