分页: 2 / 3

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-23 14:57
jmxhyz
谢宝良 写了: 数万行数据,
一两秒就完成比较并剔除重复行数据,我倒是很想知道它是如何实现的。
用hiden选项?
如果我没有误解的话,你的意思是想用“宏”这种效率低的脚本语言,去重造一个处理数据的轮子? :What
如果是这样的话,那确实需要30分钟才能处理完万行数据。

问题在于,不要重复造轮子。“宏”应该是直接调用LibreOffice本身的功能。
我理解的“宏”的最大的意义是将LibreOffice的处理工作自动化,而不是另外给LibreOffice开发新功能。
要开发新功能的话,交给C/C++,LibreOffice是开源的!

回到主题上,LibreOffice本身有筛选功能来处理重复行,不就是一两秒吗?你的“宏”直接调用LibreOffice的筛选功能,不也是一两秒就完成吗?
估计你是想对这数万行数据,使用“宏”进行无边无际的循环、判断、嵌套吧 :em04

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-23 17:22
谢宝良
jmxhyz 写了:
谢宝良 写了: 数万行数据,
一两秒就完成比较并剔除重复行数据,我倒是很想知道它是如何实现的。
用hiden选项?
如果我没有误解的话,你的意思是想用“宏”这种效率低的脚本语言,去重造一个处理数据的轮子? :What
如果是这样的话,那确实需要30分钟才能处理完万行数据。

问题在于,不要重复造轮子。“宏”应该是直接调用LibreOffice本身的功能。
我理解的“宏”的最大的意义是将LibreOffice的处理工作自动化,而不是另外给LibreOffice开发新功能。
要开发新功能的话,交给C/C++,LibreOffice是开源的!

回到主题上,LibreOffice本身有筛选功能来处理重复行,不就是一两秒吗?你的“宏”直接调用LibreOffice的筛选功能,不也是一两秒就完成吗?
估计你是想对这数万行数据,使用“宏”进行无边无际的循环、判断、嵌套吧 :em04
早几年曾用Li的宏把全拼词库转换成小鹤词库,真得花了一个多小时。
所以感觉Li的宏处理大数据的确不靠谱。

会用awk后,直接通过粘贴板储存数据,awk处理后,再返回剪贴板。也蛮方便的。

兄弟的见识确实较高,我是佩服。
想请教一事,Li的宏,明明知道思路,但就是没办法写出来,原因是它的编辑器很差劲,比如打开个文件,这么简单的代码,都只能复制粘贴,要找到教程才能复制然后修改,这真得很费劲的事情,没办法,编辑器没有补全功能,这也太难受了,您有好法子吗?
总不能次次都录制宏吧?

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-23 20:34
yq-ysy
太巧了,我之所以提出这个问题,也是因为正在编写一个开源笔顺输入法的码表,
https://github.com/YQ-YSY/stroke-seq_MB

我现在的做法是:先在 LibreOffice 里用电子表格编写原始数据,
然后再按照不同输入法的码表格式要求,经过接续、去空、排序、去重、再复制粘贴到txt文本里,
这样就可以把这个“开源笔顺输入法的码表”留给不同的开源输入法程序开发者去使用,例如 Ibus-table 和小企鹅。
(我不会写程序,所能做的,也就只有在码表上出一份力了。)

因此,继续吧,如何用宏来实现吧B列接续到A列?
——为了简化工作,可以在A列和B列的末尾,手工输入一个特殊的单元格,作为列末尾标志。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 7:37
谢宝良
yq-ysy 写了:太巧了,我之所以提出这个问题,也是因为正在编写一个开源笔顺输入法的码表,
https://github.com/YQ-YSY/stroke-seq_MB

我现在的做法是:先在 LibreOffice 里用电子表格编写原始数据,
然后再按照不同输入法的码表格式要求,经过接续、去空、排序、去重、再复制粘贴到txt文本里,
这样就可以把这个“开源笔顺输入法的码表”留给不同的开源输入法程序开发者去使用,例如 Ibus-table 和小企鹅。
(我不会写程序,所能做的,也就只有在码表上出一份力了。)

因此,继续吧,如何用宏来实现吧B列接续到A列?
——为了简化工作,可以在A列和B列的末尾,手工输入一个特殊的单元格,作为列末尾标志。


这种工作宏当然能行,但脚本会更快,无论是执行速度还是编写代码的速度。
就比如把AB列竖直排列,那太容易了。而且有部分词组如果需要手工调整,那换成gvim编辑,更快速,因为gvim也有宏录制功能。

总的来说,编辑码表,用awk跟gvim更便利,如果想让某词组排在某个位置,如第一,你只要光标定位在该词组上,然后快捷键运行gvim的宏,它就自动排在该位置上。如果大规模替换某字母,那这两工具的替换功能都是很强大的。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 8:18
谢宝良
兄弟提到的要求,其实gvim通过查找替换就全部能实现,不用编写代码。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 9:45
yq-ysy
谢宝良 写了: 这种工作宏当然能行,但脚本会更快,无论是执行速度还是编写代码的速度。
就比如把AB列竖直排列,那太容易了。而且有部分词组如果需要手工调整,那换成gvim编辑,更快速,因为gvim也有宏录制功能。

总的来说,编辑码表,用awk跟gvim更便利,如果想让某词组排在某个位置,如第一,你只要光标定位在该词组上,然后快捷键运行gvim的宏,它就自动排在该位置上。如果大规模替换某字母,那这两工具的替换功能都是很强大的。
嗯,从“提高工作效率”的角度,也许脚本更好。
我之所以想用电子表格里面的宏来实现,是考虑到要方便其他不会写脚本的朋友,也能使用这个表格继续录入码表。
毕竟,对于初学者或者其他系统平台来说,为了录入码表还要安装并学习一种脚本语言,也是感觉很麻烦的事情。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 10:27
TeliuTe
学习了,我也喜欢用libreo来处理批量查找替换合并的脚本。。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 11:48
jmxhyz
yq-ysy 写了:
因此,继续吧,如何用宏来实现吧B列接续到A列?
——为了简化工作,可以在A列和B列的末尾,手工输入一个特殊的单元格,作为列末尾标志。
下面这个宏,是把A、B列的数据合并到D列,避免影响原来的数据。如果需要复制到另一个工作表,修改一下即可。
LibreOffice的单个工作表支持百万行(1048576),足够合并了吧。

代码: 全选

Sub Main
    Dim doc, sheet1 As Object
    Dim obj As Object
    Dim oCursor As Object
    'Dim LastCol As Long
    Dim LastRow As Long
    
    doc = thiscomponent
    sheet1 = doc.sheets.getByName("Sheet1")
   'xray doc
    obj = sheet1.getCellRangeByName("A1") 
    doc.CurrentController.select(obj) '当前选择
    oCursor= sheet1.createCursor()
    oCursor.gotoEndOfUsedArea(False)
   'LastCol = oCursor.RangeAddress.EndColumn
    LastRow = oCursor.RangeAddress.EndRow '最后一行

    Dim orange1, orange2 as Object
    orange1 = sheet1.getCellRangeByName("A1:A" + cstr(LastRow + 1))
    orange2 = sheet1.getCellRangeByName("D1:D" + cstr(LastRow + 1))
    obj = orange1.getDataArray()
    orange2.setDataArray(obj)
    
    orange1 = sheet1.getCellRangeByName("B1:B" + cstr(LastRow + 1))
    orange2 = sheet1.getCellRangeByName("D" + cstr(LastRow + 2) + ":D" + cstr(2 * LastRow + 2))
    obj = orange1.getDataArray()
    orange2.setDataArray(obj)
End Sub

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 11:55
jmxhyz
谢宝良 写了:
想请教一事,Li的宏,明明知道思路,但就是没办法写出来,原因是它的编辑器很差劲,比如打开个文件,这么简单的代码,都只能复制粘贴,要找到教程才能复制然后修改,这真得很费劲的事情,没办法,编辑器没有补全功能,这也太难受了,您有好法子吗?
总不能次次都录制宏吧?
首先,LibreOffice所录制的宏,不堪使用。除非是简单的操作,不建议录制宏。

当然,LibreOffice的宏编辑器确实是无法用,只能依靠教程,从教程中复制代码。我也是这么做的。
因此,如果说有什么好方法,就是尽量积累更多的代码,形成自己的代码库了。也确实难受。
有个XrayTool,可以作为辅助,查看一下属性、方法列表。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 18:07
谢宝良
既然是其它系统的朋友使用,
你能确定他有Libreoffice?
还有宏的运行方式,是快件键?还是菜单图标?
如果需要好几个宏,对于陌生人,使用方式只能是图标,你得帮忙部署好配置,不然别人可不懂如何运行的。



gvim的优点是体积小,免安装,搭配一个配置文件就能在不同系统使用一样的功能,菜单可任意增加功能。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 18:21
谢宝良
只要以空格为分界,粘贴到excel就自动分裂成两行。

其实他们也可搭配使用,我以前整理码表(我现在手机、电脑的输入法都使用自己整理的码表)就是搭配使用writer跟calc。

我用writer的特有的全选功能(Ooo独特的不连续选择),一下就剪贴出所有4个字的成语词组跟对应的拼音,然后再用calc的宏根据规则转换。

不是勉强你使用我喜欢的软件,而是说尽量用多种手段解决问题。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 20:48
yq-ysy
谢宝良 写了:既然是其它系统的朋友使用,
你能确定他有Libreoffice?
还有宏的运行方式,是快件键?还是菜单图标?
如果需要好几个宏,对于陌生人,使用方式只能是图标,你得帮忙部署好配置,不然别人可不懂如何运行的。

gvim的优点是体积小,免安装,搭配一个配置文件就能在不同系统使用一样的功能,菜单可任意增加功能。
我是希望有人能携手帮助一起输入码表,
且从“尽量减少操作的麻烦程度”的角度去考虑共享开源输入法码表的。
因为单个汉字就有2万,对应三种笔顺码表就6万,词组更是十几万x3甚至几十万x3。
——就怕原本有热心帮忙的,一看,哟,想帮你录入还得这么麻烦,又是宏又是脚本,算了,不干了。

至少Libreoffice可以免费下载,且有LInux、windows、Mac OS X 版本。
我不知道宏会保存在哪里?
我一直以为在电子表格文件ods里创建的宏会保存在同一个文件里。
如果是保存为其它文件,那就得一起放出来共享了。当然也得写上如何操作等步骤。
——从你的图上看,gvim也有查找、去重、去空等功能,似乎不错,排序能否解决?

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 21:03
yq-ysy
jmxhyz 写了:
yq-ysy 写了:
因此,继续吧,如何用宏来实现吧B列接续到A列?
——为了简化工作,可以在A列和B列的末尾,手工输入一个特殊的单元格,作为列末尾标志。
下面这个宏,是把A、B列的数据合并到D列,避免影响原来的数据。如果需要复制到另一个工作表,修改一下即可。
LibreOffice的单个工作表支持百万行(1048576),足够合并了吧。

代码: 全选

Sub Main
    Dim doc, sheet1 As Object
    Dim obj As Object
    Dim oCursor As Object
    'Dim LastCol As Long
    Dim LastRow As Long
    
    doc = thiscomponent
    sheet1 = doc.sheets.getByName("Sheet1")
   'xray doc
    obj = sheet1.getCellRangeByName("A1") 
    doc.CurrentController.select(obj) '当前选择
    oCursor= sheet1.createCursor()
    oCursor.gotoEndOfUsedArea(False)
   'LastCol = oCursor.RangeAddress.EndColumn
    LastRow = oCursor.RangeAddress.EndRow '最后一行

    Dim orange1, orange2 as Object
    orange1 = sheet1.getCellRangeByName("A1:A" + cstr(LastRow + 1))
    orange2 = sheet1.getCellRangeByName("D1:D" + cstr(LastRow + 1))
    obj = orange1.getDataArray()
    orange2.setDataArray(obj)
    
    orange1 = sheet1.getCellRangeByName("B1:B" + cstr(LastRow + 1))
    orange2 = sheet1.getCellRangeByName("D" + cstr(LastRow + 2) + ":D" + cstr(2 * LastRow + 2))
    obj = orange1.getDataArray()
    orange2.setDataArray(obj)
End Sub
运行这个宏之前,需要其它什么操作吗?例如“选中某一列”之类的?
我运行这个宏,出现出错提示,其得到的结果只复制了A列到D列中,没有把B列接续上去。

代码: 全选

BASIC 运行时间错误.
发生异常 
Type: com.sun.star.uno.RuntimeException
Message: 。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 21:21
谢宝良
如果是拼音类输入法,不需要重新输入逐字编码。
如果是新的编码输入法,应该编好规则,然后用人工输入编码,但汉字不要重新输入,所有的汉字单字,网上都有了。
编好单字,词组就用脚本配码,不能人工操作了。


编码表的关键是单字,而不是词组,词组可以电脑配码。那怕是单字,也不用输汉字,只需输字母码。

所以,你真正需要的不是删除空格,把两列变成一列的功能,因为编码大量重复的操作是更改,定位,查找等功能。

Re: LibreOffice电子表格里,如何去除A列和B列并列时的重复行?如何把B列接续到A列下方?

发表于 : 2016-04-24 21:24
谢宝良
yq-ysy 写了:
jmxhyz 写了:
yq-ysy 写了:
因此,继续吧,如何用宏来实现吧B列接续到A列?
——为了简化工作,可以在A列和B列的末尾,手工输入一个特殊的单元格,作为列末尾标志。
下面这个宏,是把A、B列的数据合并到D列,避免影响原来的数据。如果需要复制到另一个工作表,修改一下即可。
LibreOffice的单个工作表支持百万行(1048576),足够合并了吧。

代码: 全选

Sub Main
    Dim doc, sheet1 As Object
    Dim obj As Object
    Dim oCursor As Object
    'Dim LastCol As Long
    Dim LastRow As Long
    
    doc = thiscomponent
    sheet1 = doc.sheets.getByName("Sheet1")
   'xray doc
    obj = sheet1.getCellRangeByName("A1") 
    doc.CurrentController.select(obj) '当前选择
    oCursor= sheet1.createCursor()
    oCursor.gotoEndOfUsedArea(False)
   'LastCol = oCursor.RangeAddress.EndColumn
    LastRow = oCursor.RangeAddress.EndRow '最后一行

    Dim orange1, orange2 as Object
    orange1 = sheet1.getCellRangeByName("A1:A" + cstr(LastRow + 1))
    orange2 = sheet1.getCellRangeByName("D1:D" + cstr(LastRow + 1))
    obj = orange1.getDataArray()
    orange2.setDataArray(obj)
    
    orange1 = sheet1.getCellRangeByName("B1:B" + cstr(LastRow + 1))
    orange2 = sheet1.getCellRangeByName("D" + cstr(LastRow + 2) + ":D" + cstr(2 * LastRow + 2))
    obj = orange1.getDataArray()
    orange2.setDataArray(obj)
End Sub
运行这个宏之前,需要其它什么操作吗?例如“选中某一列”之类的?
我运行这个宏,出现出错提示,其得到的结果只复制了A列到D列中,没有把B列接续上去。

代码: 全选

BASIC 运行时间错误.
发生异常 
Type: com.sun.star.uno.RuntimeException
Message: 。
必须在工具栏或者单元格建立个按钮,不然谁懂用宏?