找回密码
 加入
搜索
查看: 16412|回复: 18

[系统综合] 如何更快更便捷地把excel单元格中的部分内容正则批量替换[已解决]

 火.. [复制链接]
发表于 2013-2-12 23:51:36 | 显示全部楼层 |阅读模式
本帖最后由 cnergao 于 2013-2-14 11:53 编辑

国家                       简介
中国        语言:<strong>汉字<br /></strong>
美国        语言:<strong>美式英语<br /></strong>
日本        语言:<strong>日语<br /></strong>
俄罗斯        语言:<strong>俄语<br /></strong>
英国        语言:<strong>英语<br /></strong>
德国        语言:<strong>德语<br /></strong>

以上是两列excel表格的内容。
我现要想要做的是把简介这列表格中“<strong>汉字<br /></strong>"内“汉字”等文字替换成“国家”列中的文字内容

即变成下面的
国家                       简介
中国        语言:<strong>中国<br /></strong>
美国        语言:<strong>美国<br /></strong>
日本        语言:<strong>日本<br /></strong>
俄罗斯        语言:<strong>俄罗斯<br /></strong>
英国        语言:<strong>英国<br /></strong>
德国        语言:<strong>德国<br /></strong>
#include <Excel.au3>
Local  $aArray2,$aArray1
$sFilePath1 = "D:\AUTOIT_3.3.7.15.1\Test.xls" ;该文件应该已存在
$oExcel = _ExcelBookOpen($sFilePath1)

$I=$oExcel.ActiveSheet.Range("A65535").End(-4162).Row;读取单元格数
$aArray1 = _ExcelReadArray($oExcel, 2, 1, $I-1, 1) ;从活动工作表的行或列创建一个数组垂直方向
$aArray2 = _ExcelReadArray($oExcel, 2, 2, $I-1, 1)
$Y=0
do
_ExcelWriteCell($oExcel,StringRegExpReplace($aArray2[$Y], '<(?i)strong>(.*?)<(?i)b', '<strong>'&$aArray1[$Y]&'<b'),$Y+1,2)
$Y=$Y+1
until $Y=$I-1
以上只是简单的几条数据,实际有几千上万条数据。我的思路是要全部读取替换完保存到数组再写回单元格。但是数组操作出错,怎么把DO until 这段改成数组写回单元格?

以上程序改成数组方式写入示例
#include <Excel.au3>
#include <Array.au3>
Local $I, $Y, $result, $aArray2,$aArray1
$sFilePath1 = "D:\AUTOIT_3.3.7.15.1\Test.xls" ;该文件应该已存在
$oExcel = _ExcelBookOpen($sFilePath1)

$I=$oExcel.ActiveSheet.Range("A65535").End(-4162).Row;读取列表有效单元格数
$aArray1 = _ExcelReadArray($oExcel, 2, 1, $I-1, 1) ;从活动工作表的行或列创建一个数组垂直方向
$aArray2 = _ExcelReadArray($oExcel, 2, 2, $I-1, 1)

Dim $array[$I-1];定义数组做为保存替换用
$Y=0
do
        $array[$Y]=StringRegExpReplace($aArray2[$Y], '<(?i)strong>(.*?)<(?i)b', '<strong>'&$aArray1[$Y]&'<b');保存正则替换的数组
        $Y=$Y+1
Until $y=$I-1
_ExcelWriteArray($oExcel,2,2,$array,1,0);写入数组
之前因为数组的定义问题。一直写入出错。请大家看看还有什么需要改进,这个数组的定义还有其他方法没?
发表于 2013-2-13 12:20:44 | 显示全部楼层
用多个case 去做罗...先抓出汉字/美语/日语/鸟语再去replace它
发表于 2013-2-13 12:23:04 | 显示全部楼层
我的思路:
1. 另存为csv文件
2. Fileopen打开—>正则替换->保存
3.再次另存为xls文件
 楼主| 发表于 2013-2-13 14:04:12 | 显示全部楼层
回复 2# henry10423

以上只是简单的几条数据,实际有几千上万条数据。

你这CASE条件是什么?
请问怎么写?
 楼主| 发表于 2013-2-13 14:11:30 | 显示全部楼层
回复 3# xms77


读出来的都是数组。
我想直接换好用_excelwritearray写把数组。少个另存为步骤可省不少时间吧。
把_excelwritecell写单元格变成_excelwritearray写数组。
发表于 2013-2-13 14:20:06 | 显示全部楼层
回复 5# cnergao
我觉得用excel对象来操作是很慢的,文本正则替换才是高效的
 楼主| 发表于 2013-2-13 15:16:36 | 显示全部楼层
回复 6# xms77

两种方法都写一下。运行对比一下看那个快!
发表于 2013-2-13 16:47:42 | 显示全部楼层
提供一下附件看下
发表于 2013-2-13 17:01:50 | 显示全部楼层
回复 5# cnergao


    明显#3楼xms77提供的方法针对大据而方快太多了。少了太多的写操作。
其实可以在Excel里直接操作替换的,也不会慢的,甚至更快,因Excel里用的是数据引擎,算法都是经过千锤百炼的,还不是单线程。
 楼主| 发表于 2013-2-13 18:04:38 | 显示全部楼层
回复 9# happytc

对。我就是这么想的。表格列读出来的时候就是一个数组。直接对数组进行替换并保存至另一个数组。全部替换好。再写入
 楼主| 发表于 2013-2-13 18:38:08 | 显示全部楼层
回复 8# kevinch

附件跟这个样式一样的。也是这么改一个地方,这个是简例只有2列5行。实际操作附件有十几列几千上万行数据。对这个简例操作就行。想要内容多一些。多复制几个就行!
 楼主| 发表于 2013-2-13 18:40:24 | 显示全部楼层
回复 9# happytc
Dim $array[$I-1];定义数组做为保存替换用
$Y=0
do
        $array[$Y]=StringRegExpReplace($aArray2[$Y], '<(?i)strong>(.*?)<(?i)b', '<strong>'&$aArray1[$Y]&'<b');保存正则替换的数组
        $Y=$Y+1
Until $y=$I-1
_ExcelWriteArray($oExcel,2,2,$array,1,0);写入数组
我现在把单个写表格改成数组写了。你看看。还有什么需要修改。运行效果更好的?
发表于 2013-2-13 19:03:54 | 显示全部楼层
$file="z:\test.xlsx"
$excel=ObjCreate("excel.application")
$excel.visible=False
$wb=$excel.workbooks.open($file)
With $wb.activesheet
        $arr=.range("a2:a"&.cells(.rows.count,1).end(3).row).value
        For $n=0 To UBound($arr,2)-1
                If $arr[0][$n]<>"" Then $arr[0][$n]="语言:<strong>"&$arr[0][$n]&"<br /></strong>"
        Next
        .range("a2:a"&.cells(.rows.count,1).end(3).row).offset(0,1).value=$arr
EndWith
$wb.close(True)
$excel.quit
$wb=Null
$excel=Null
这样试下,似乎没必要替换,直接生成新的就可以了
发表于 2013-2-13 19:49:30 | 显示全部楼层
回复  kevinch

附件跟这个样式一样的。也是这么改一个地方,这个是简例只有2列5行。实际操作附件有十几列几千上万行数据。对这个简例操作就行。想要内容多一些。多复制几个就行!
cnergao 发表于 2013-2-13 18:38



    仔细一看,才这么点数据量呀,我看到上千万行了

万把行的数据,随便什么方法都可以的。最长也就几秒钟完成了
 楼主| 发表于 2013-2-13 23:22:19 | 显示全部楼层
回复 13# kevinch

关闭屏幕刷新
Application.ScreenUpdating=False
这个语句怎么使用?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-6 10:34 , Processed in 0.083682 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表