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

OOo,TeX,KO,ABI,GIMP,Picasa,ProE,QCAD,Inkscape,Kicad,Eagle
头像
yq-ysy
论坛版主
帖子: 4652
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)

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

#1

帖子 yq-ysy » 2016-04-22 0:54

LibreOffice电子表格里,已经有一个工作表,其中有A列和B列数据,遇到两个问题:
(1)如何去除A列和B列并列时的重复行?例如原本有A列和B列数据如下:
1 一
2 二
2 二
2 贰
3 三
需要删除其中多出的“2 二”重复行,希望得到:
1 一
2 二
2 贰
3 三
——如果使用“数据--高级筛选--只显示不重复项”只能判断第一列,会把所有带 2 的行都删除,

(2)如何把B列接续到A列下方?——最好把结果放到另一个工作表里。希望得到:
1
2
2
2
3





——如果能实现修改第一个工作表,这个接续的第二个工作表也能自动跟随改变,就更好了。

-------------------- 解决方案总结 -------------------

第一个问题感谢 jmxhyz 提供思路。现在已经得到解决,方法和步骤是:
(a)选中A列和B列的标题头,点击工具栏的”标准筛选按钮“,
(b)点击A列和B列的标题头的下拉菜单,选择”标准筛选…“,弹出”标准筛选“窗口,
(c)在”标准筛选“窗口里,第一个”字段名“选择A列的标题头,右边的”值“选择”非空“;
——解决了”需要删除A列空内容单元格所在行“的问题。
(d)在”标准筛选“窗口里,展开”选项“,勾选”无重复值”即可。
——解决了“需要删除A列和B列时的重复行”的问题(其实是重复行是被折叠隐藏起来了)。

第二个问题——手工接续,感谢 谢宝良 提供。
可以先 ctrl+shift+end 从所选单元格全选至右下角末尾
然后 ctrl+shift+左箭头,即可快速当初所选单元格所在一列。
(或者,先 ctrl+shift+end 然后 shift+左箭头 这样就能逐个取消被多选的其它列,只选中需要的单列了。)
然后手工复制粘贴就能把B列接续到A列了。

第二个问题——宏接续,见23楼,也许需要修改,感谢 jmxhyz 提供。
第二个问题——AWK脚本接续,见13楼,感谢 谢宝良 提供。
谢宝良
帖子: 1983
注册时间: 2010-05-01 21:23

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

#2

帖子 谢宝良 » 2016-04-22 9:37

yq-ysy 写了:LibreOffice电子表格里,已经有一个工作表,其中有A列和B列数据,遇到两个问题:
(1)如何去除A列和B列并列时的重复行?例如原本有A列和B列数据如下:

(2)如何把B列接续到A列下方?——最好把结果放到另一个工作表里。希望得到:
——如果能实现修改第一个工作表,这个接续的第二个工作表也能自动跟随改变,就更好了。
用Li的宏很容易搞定了。单单想用筛选功能,应该不行。

或者构造多一个数列(合并第一二列),把它作为筛选条件。
上次由 谢宝良 在 2016-04-22 11:39,总共编辑 1 次。
头像
tang.zhe
帖子: 1505
注册时间: 2010-07-15 13:31

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

#3

帖子 tang.zhe » 2016-04-22 10:47

看看可行否?
见更新附件。
附件
sample.ods.zip
(8.44 KiB) 已下载 160 次
上次由 tang.zhe 在 2016-04-22 13:21,总共编辑 1 次。
头像
Ping-Wu
帖子: 1822
注册时间: 2012-11-14 9:34
系统: Debian 12

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

#4

帖子 Ping-Wu » 2016-04-22 11:55

yq-ysy 写了:LibreOffice电子表格里,已经有一个工作表,其中有A列和B列数据,遇到两个问题:
(1)如何去除A列和B列并列时的重复行?例如原本有A列和B列数据如下:

(2)如何把B列接续到A列下方?——最好把结果放到另一个工作表里。希望得到:
——如果能实现修改第一个工作表,这个接续的第二个工作表也能自动跟随改变,就更好了。
Mark 一下,有时间再回来。
头像
yq-ysy
论坛版主
帖子: 4652
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)

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

#5

帖子 yq-ysy » 2016-04-22 20:46

tang.zhe 写了:看看可行否?
见更新附件。
谢谢各位的热心帮助。
我研究学习了仁兄的样本文件,你所采用的思路原理基本弄懂了,不过也有一些问题不明白……

第(1)个问题,
你是先把A列和B列的内容合并起来【公式 =A2&B2】,放在第三列,
然后在第四列里,为第三列每个单元格进行条件统计,如果大于1就标注为1【公式 =IF(COUNTIF(C$1:C2,C2)>1,1,"")】
这样实现了“在第四列标注出重复行“,——但没有实现”删除重复行“功能。
由于数据有可能多达数万条,无法手工删除,因此,还需要想办法实现”自动删除重复行“(可以把结果放在另两列)。

此外,从你的例子里,也学到了一招,很实用:
选中列标题,然后在工具栏里,点击启用”自动筛选按钮“,即可实现带下拉菜单排序的功能。

第(2)个问题,
方法主要用到 INDIRECT 函数,返回一个以文字格式输入的单元格引用的内容。
基本可以解决把B列接续到A列,但实际应用遇到一些更复杂的情况时,会出问题。

在另一个工作表里,先用两列来查找原A列和B列的结尾,即判断该单元格内容是否为0,如果为0就是结尾,
如果不是结尾就标注为1 【公式 =IF(INDIRECT("Sheet1.A"&ROW())=0,0,1)】
——这里有个问题,就是A列或B列的内容里,有可能包含内容为0或者为空的单元格,这就会造成后续公式的判断错误。

继续,经过上述公式,在新的工作表里得到新a列和新b列两列数字1,
然后在第三列里,【公式 =INDIRECT(IF(A2>0,"sheet1.a"&ROW(),"sheet1.b"&ROW()-COUNTA(Sheet1.A$1:A$10000)+1))】
即判断新a列是否大于0,即是否有内容,如果有,就返回原工作表的A列相应单元格内容,放在第三列里。
如果判断a列没有内容,那么就提取原工作表的B列相应单元格的内容,
但此时已经计数到了A列的末尾,因此,需要在B列定位到(A列末尾减去A列总数+1)的位置,就可以得到原始B列的准确位置。
然后继续沿着A列走下去,就能把B列内容逐一也提取出来,接续放在新工作表的第三列后面了。

——这里有两个问题,
一是A列末尾减去A列总数,使用的是10000这个数字,而实际数据有可能多达几万,有没有一个专门用于”统计某列行数“的函数??
二是刚才第(1)个问题里说的,是A列或B列的内容里,有可能包含内容为0或者为空的单元格,这里会造成公式的判断错误。
实际应用中,如果遇到带有空内容的单元格,是需要删除这一行的(我最早没有提出这个要求,是不想一次麻烦大家太多……)。
jmxhyz
帖子: 78
注册时间: 2012-02-12 20:44

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

#6

帖子 jmxhyz » 2016-04-22 21:58

第一个问题,使用“标准筛选”即可完成,而且“标准筛选”可以设置、组合四个筛选条件。勾上“无重复值”即可过滤重复项。
也就是说,标准筛选可以去除四列重复的行。

至于第二个问题,上面的解决方法,导致整个工作表全是公式,如果要重算的话,直接影响工作效率。
倒不如几行简单的宏代码。
(这也是Linux下,WPS无法成气候的最大原因)
谢宝良
帖子: 1983
注册时间: 2010-05-01 21:23

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

#7

帖子 谢宝良 » 2016-04-22 22:18

既然是数万行的数据,还是建议awk脚本处理较快速。
头像
yq-ysy
论坛版主
帖子: 4652
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)

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

#8

帖子 yq-ysy » 2016-04-22 22:38

jmxhyz 写了:第一个问题,使用“标准筛选”即可完成,而且“标准筛选”可以设置、组合四个筛选条件。勾上“无重复值”即可过滤重复项。
也就是说,标准筛选可以去除四列重复的行。

至于第二个问题,上面的解决方法,导致整个工作表全是公式,如果要重算的话,直接影响工作效率。
倒不如几行简单的宏代码。
(这也是Linux下,WPS无法成气候的最大原因)
谢谢 jmxhyz 提供思路。

现在第一个问题已经得到解决,方法和步骤是:
(a)选中A列和B列的标题头,点击工具栏的”标准筛选按钮“,
(b)点击A列和B列的标题头的下拉菜单,选择”标准筛选…“,弹出”标准筛选“窗口,
(c)在”标准筛选“窗口里,第一个”字段名“选择A列的标题头,右边的”值“选择”非空“;
——解决了”需要删除A列空内容单元格所在行“的问题。
(d)在”标准筛选“窗口里,展开”选项“,勾选”无重复值”即可。
——解决了“需要删除A列和B列时的重复行”的问题(其实是重复行是被折叠隐藏起来了)。

第二个问题,我从来没有用过宏,还请多多指教。
感觉通过这样的实践操作,能学到很多东西。
谢宝良
帖子: 1983
注册时间: 2010-05-01 21:23

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

#9

帖子 谢宝良 » 2016-04-22 22:44

如果有万行数据,用宏处理一次,大概要30分钟左右。
还是脚本快速。


把数据放进 xxx.txt
结果输出到123.txt

A列在上
B列接后

代码: 全选

awk '!a[$0]++{print $1}' xxx.txt > 123.txt
awk '!a[$0]++{print $2}' xxx.txt >> 123.txt
如果想让AB列并排:

代码: 全选

awk '!a[$0]++{print $0}' xxx.txt > 123.txt
谢宝良
帖子: 1983
注册时间: 2010-05-01 21:23

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

#10

帖子 谢宝良 » 2016-04-22 22:57

LibreOffice的宏实现这个目的也简单,但数万行数据运行时间30分钟以上一次。

脚本处理,哪怕有10万行,也只要数秒钟而已。
头像
yq-ysy
论坛版主
帖子: 4652
注册时间: 2008-07-19 12:44
来自: 广西(桂)南宁(邕)

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

#11

帖子 yq-ysy » 2016-04-22 23:49

谢宝良 写了:如果有万行数据,用宏处理一次,大概要30分钟左右。
还是脚本快速。

把数据放进 xxx.txt
结果输出到123.txt

A列在上
B列接后

代码: 全选

awk '!a[$0]++{print $1}' xxx.txt > 123.txt
awk '!a[$0]++{print $2}' xxx.txt >> 123.txt
如果想让AB列并排:

代码: 全选

awk '!a[$0]++{print $0}' xxx.txt > 123.txt
谢谢你提供的语句,我试试。不知道数万条记录,在电子表格里“筛选”是不是也会很慢呢?
如果也很慢的话,恐怕“删除重复行、删除带有空单元格数据的行、按升序排序”这三个工作也得用awk语言来完成……
谢宝良
帖子: 1983
注册时间: 2010-05-01 21:23

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

#12

帖子 谢宝良 » 2016-04-23 7:41

如果只要两列数据都存在的行,那得加个条件:

代码: 全选

awk   '!a[$0]++{if(NF==2){print $1}}' xxx.txt > 123.txt
awk   '!a[$0]++{if(NF==2){print $2}}' xxx.txt >> 123.txt

代码: 全选


awk  '!a[$0]++{if(NF==2){print $0}}' xxx.txt > 123.txt

如果单个数据中间有空格,如A列的第一个数据是12 3
那必须在excel里边用替换功能,把这个单个数据内部的空格换成其他的独特字符,整理后再粘贴回excel,再替换回空格。

使用筛选或者数据透视表功能当然要比宏要快很多。
谢宝良
帖子: 1983
注册时间: 2010-05-01 21:23

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

#13

帖子 谢宝良 » 2016-04-23 8:07

代码: 全选

这个考虑得比较周密:

awk -F"\t"  '!a[$0]++{if($1!="" && $2!=""){print $1}}' xxx.txt > 123.txt
awk -F"\t"  '!a[$0]++{if($1!="" && $2!=""){print $2}}' xxx.txt >> 123.txt

jmxhyz
帖子: 78
注册时间: 2012-02-12 20:44

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

#14

帖子 jmxhyz » 2016-04-23 11:43

谢宝良 写了:LibreOffice的宏实现这个目的也简单,但数万行数据运行时间30分钟以上一次。

脚本处理,哪怕有10万行,也只要数秒钟而已。
:Misdoubt

不要吓人。LibreOffice处理数万行数据,也是一两秒的事情。用“宏”也是一样。
本来“宏”就是把操作自动化而已,如果LibreOffice本身处理数据不慢的话,用“宏”也是不会慢的。
如果用“宏”慢,基本上是编写不合理,突出问题是,时间浪费在LibreOffice界面的重绘和单元格公式的重算上。在宏运行的时候,先关闭重绘和重算。
谢宝良
帖子: 1983
注册时间: 2010-05-01 21:23

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

#15

帖子 谢宝良 » 2016-04-23 12:10

jmxhyz 写了:
谢宝良 写了:LibreOffice的宏实现这个目的也简单,但数万行数据运行时间30分钟以上一次。

脚本处理,哪怕有10万行,也只要数秒钟而已。
:Misdoubt

不要吓人。LibreOffice处理数万行数据,也是一两秒的事情。用“宏”也是一样。
本来“宏”就是把操作自动化而已,如果LibreOffice本身处理数据不慢的话,用“宏”也是不会慢的。
如果用“宏”慢,基本上是编写不合理,突出问题是,时间浪费在LibreOffice界面的重绘和单元格公式的重算上。在宏运行的时候,先关闭重绘和重算。

那应该是本人孤陋寡闻了。
不过,我在使用官方的宏说明文件的时候,用writer打开,查找个单词都要两三秒。

数万行数据,
一两秒就完成比较并剔除重复行数据,我倒是很想知道它是如何实现的。
用hiden选项?
回复