组合来自mysql表的字符串,不需要额外的空格

时间:2015-05-20 20:12:53

标签: python mysql regex django performance

我一直在研究这个django应用程序。我们从加利福尼亚州的一家机构提取大量的表格,处理数据并重新发布。我一直在尝试做一些简单的事情,但简单的实现非常缓慢,我可能会认为自己陷入了困境。这是其中一个表格。有很多像这样的表。

mysql> desc EXPN_CD;
+------------+---------------+------+-----+---------+-------+
| Field      | Type          | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| AGENT_NAMF | varchar(45)   | NO   |     | NULL    |       |
| AGENT_NAML | varchar(200)  | NO   |     | NULL    |       |
| AGENT_NAMS | varchar(10)   | NO   |     | NULL    |       |
| AGENT_NAMT | varchar(10)   | NO   |     | NULL    |       |
| AMEND_ID   | int(11)       | NO   | MUL | NULL    |       |
| AMOUNT     | decimal(14,2) | NO   |     | NULL    |       |
| BAKREF_TID | varchar(20)   | NO   |     | NULL    |       |
| BAL_JURIS  | varchar(40)   | NO   |     | NULL    |       |
| BAL_NAME   | varchar(200)  | NO   |     | NULL    |       |
| BAL_NUM    | varchar(7)    | NO   |     | NULL    |       |
| CAND_NAMF  | varchar(45)   | NO   |     | NULL    |       |
| CAND_NAML  | varchar(200)  | NO   |     | NULL    |       |
| CAND_NAMS  | varchar(10)   | NO   |     | NULL    |       |
| CAND_NAMT  | varchar(10)   | NO   |     | NULL    |       |
| CMTE_ID    | varchar(9)    | NO   |     | NULL    |       |
| CUM_OTH    | decimal(14,2) | YES  |     | NULL    |       |
| CUM_YTD    | decimal(14,2) | YES  |     | NULL    |       |
| DIST_NO    | varchar(3)    | NO   |     | NULL    |       |
| ENTITY_CD  | varchar(3)    | NO   |     | NULL    |       |
| EXPN_CHKNO | varchar(20)   | NO   |     | NULL    |       |
| EXPN_CODE  | varchar(3)    | NO   |     | NULL    |       |
| EXPN_DATE  | date          | YES  |     | NULL    |       |
| EXPN_DSCR  | varchar(400)  | NO   |     | NULL    |       |
| FILING_ID  | int(11)       | NO   | MUL | NULL    |       |
...

我正在浏览所有这些表格。我拿出每个名字," CAND" (候选人),"代理"等等,并将每个参考文献放入一行:

mysql> desc calaccess_campaign_browser_name;
+-------------+---------------+------+-----+---------+----------------+
| Field       | Type          | Null | Key | Default | Extra          |
+-------------+---------------+------+-----+---------+----------------+
| id          | int(11)       | NO   | PRI | NULL    | auto_increment |
| ext_pk      | int(11)       | NO   | MUL | NULL    |                |
| ext_table   | varchar(255)  | NO   |     | NULL    |                |
| ext_prefix  | varchar(255)  | NO   |     | NULL    |                |
| naml        | varchar(255)  | YES  |     | NULL    |                |
| namf        | varchar(255)  | YES  |     | NULL    |                |
| nams        | varchar(255)  | YES  |     | NULL    |                |
| namt        | varchar(255)  | YES  |     | NULL    |                |
| name        | varchar(1023) | YES  |     | NULL    |                |
+-------------+---------------+------+-----+---------+----------------+

值永远不会为null,但许多(有时绝大多数)都是空字符串。

我正在构建名称列。显而易见的方法是:

concat(namt,'',namf,'',naml,'',nams)

但是当其中有2或3个空白时,会在字符串的开头或结尾处给我很多双空格和空格填充。

我做过的事情:

1)使用python正则表达式来查找和删除多余的空格。如果我有一个月左右的时间可以运行,那就行了。

2)如上所述将名称放在一起并使用SQL查找并替换多余的空格。再次,需要很长时间。

其中一个问题是python的MySQL库有一个特别设置的游标用于处理大型结果集。大型查询操作没有类似的东西。或许我正在看这个错误。

% pip freeze
...
MySQL-python==1.2.5c
...

3)将名称拉出到以制表符分隔的文本文件中并在那里进行修复,然后将文件加载到新表中。布莱什。很多愚蠢的脚本。使用sed还是awk?什么?

4)我可以在15个不同的查询中执行concat()操作,并为每个查询执行正确的concat,以便我在名称中没有多余的空格。我有:

  1. namt = null和namf = null和naml = null和nams!= null(案例0001)
  2. namt = null和namf = null和naml!= null和nams = null(案例0010)
  3. namt = null和namf = null和naml!= null和nams!= null(案例0011)
  4. 等等。
  5. 这实际上就是我的用途。运行不到一天。哇噢!

    但是我也是出于其他原因做了类似的事情,我多次想要编写这种代码?伊克!

    我必须有一种更聪明的方式来做到这一点,我没有看到。我在大约24个表中执行此操作,每个表中有2 - 5个名称,有时大约15,000行,有时20,000,000行。大多数餐桌的价格在300,000到750,000之间。而且,jeez,我累了....

1 个答案:

答案 0 :(得分:1)

在MySQL中,我认为您正在寻找concat_ws()

concat_ws(' ', nullif(namt, ''), nullif(namf, ''), nullif(naml, ''), nullif(nams, ''))

nullif()如果为空,则将值转为NULLconcat_ws()会忽略NULL个值,因此您不会获得重复的空格。