Board logo

标题: [文本处理] [已解决]excel表A列内容有不同数量的重复,A列相同的行,取B列数字最大的那一行 [打印本页]

作者: 13545876873    时间: 2024-9-16 19:17     标题: [已解决]excel表A列内容有不同数量的重复,A列相同的行,取B列数字最大的那一行

本帖最后由 13545876873 于 2024-9-19 09:59 编辑

求助大哥们:这个要怎么实现啊 ;  如果A列相同的行对应的B列数值,是一样的,只需要复制其中的一个就行了


作者: ppll2030    时间: 2024-9-16 20:36

本帖最后由 ppll2030 于 2024-9-16 20:42 编辑

回复 1# 13545876873


    这个直接操作表格,比写脚本还要快啊。
在C列之前插入一列空白列,然后在C2单元格填写公式 “=MAX(IF(A:A=A2,B:B))”,然后下拉填充所有单元格。
在C2单元格使用条件格式,新建规则,使用公式 “=B2=C2”,然后点格式选择一个颜色,当条件成立是就会显示该颜色了。
选择C2单元格,双击下拉填充得到符合条件的结果。
在通过颜色筛选,把无颜色标记的所有行全部删除,剩下的就是你要的结果了。

GIF太大,点击或是拖拽到新窗口查看吧


作者: aloha20200628    时间: 2024-9-16 20:42

本帖最后由 aloha20200628 于 2024-9-17 11:23 编辑

回复 1# 13545876873

将表1电子表格文件存为 1.csv,运行以下代码生成 2.csv,再用 excel 打开即可...
备注:以下代码存为 test.bat 运行和 1.csv 同目录...
  1. @echo off &setlocal enabledelayedexpansion
  2. sort /rec 8192 1.csv /o 11.csv
  3. (for /f "delims=" %%A in (11.csv) do for /f "tokens=1-2 delims=," %%a in ("%%~A") do (
  4. if "%%~a"=="!_a!" if %%b gtr !_b! set "v=%%A"
  5. if "%%~a" neq "!_a!" if defined v echo,!v!&set "_b=" &set "v="
  6. set "_a=%%a" &if not defined _b set "_b=%%b" &if not defined v set "v=%%A"
  7. )
  8. if defined v echo,!v!)>2.csv
  9. ::del /q 1.csv 11.csv
  10. endlocal&pause&exit/b
复制代码

作者: 13545876873    时间: 2024-9-16 21:25

回复 2# ppll2030 大哥,你的图片看不太清哈。 我试了你的方法,
这个函数得到的结果,是B列的最大值,不行啊

作者: 13545876873    时间: 2024-9-16 21:37

回复 3# aloha20200628
大哥,我试了你的这个方法,有点问题呀
这是文件夹里的内容:
这是表1内容:
这是2.csv内容:
作者: ppll2030    时间: 2024-9-16 21:38

回复 4# 13545876873


    GIF太大,点击或是拖拽到新窗口查看吧
不行就把下面地址复制到新窗口打开

图片地址: https://ibb.co/RDWW6Cf
作者: ppll2030    时间: 2024-9-16 21:45

回复 5# 13545876873

你的电脑肯定有问题。

大佬的脚本,我也测试了。结果是一致的。除了没有颜色
作者: ppll2030    时间: 2024-9-16 21:52

回复 8# 13545876873


    啊。对了,忘了说了,输入了函数后,同时按下Ctrl+Shift+Enter完成才能得到正确的值。
作者: aloha20200628    时间: 2024-9-16 22:01

本帖最后由 aloha20200628 于 2024-9-16 22:12 编辑

回复 5# 13545876873

输出 1.csv 之前一定先按A列排完序的!
3楼代码已订正,先对 1.csv 排序再处理...
如须删除 1.csv, 11.csv 文件可剔除第9行开头的 :: 前缀即可...

作者: flashercs    时间: 2024-9-16 22:03

在ThisWorkbook新建VBA宏
  1. Sub SortAndFilter()
  2. ' Order by Column A Asc,B Desc,and select B Max value rows into Sheet2.
  3. On Error Resume Next
  4. Dim rng As Range, oSort As Sort, sht1 As Worksheet, sht2 As Worksheet, i As Long, ii As Long
  5. Dim col1, col2, aValue
  6. col1 = 1 ' 第一列,有重复值
  7. col2 = 2 ' 第二列,取最大值
  8. Application.ScreenUpdating = False
  9. With ThisWorkbook
  10.     Set sht1 = .Worksheets(1)
  11.     Set sht2 = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))
  12.     Set rng = sht1.UsedRange
  13.     Set oSort = sht1.Sort
  14.     With oSort
  15.         .SortFields.Clear
  16.         .SortFields.Add rng.Columns(col1), xlSortOnValues, xlAscending
  17.         .SortFields.Add rng.Columns(col2), xlSortOnValues, xlDescending
  18.         .SetRange rng
  19.         .Header = xlYes
  20.         .MatchCase = False
  21.         .SortMethod = xlPinYin
  22.         .Apply
  23.     End With
  24.     rng.Rows(1).Copy sht2.Rows(1)
  25.     ii = 2
  26.     aValue = Null
  27.     For i = 2 To rng.Rows.Count
  28.         If IsNull(aValue) Or aValue <> rng.Cells(i, col1).Value Then
  29.             'copy this row
  30.             rng.Rows(i).Copy sht2.Cells(ii, 1)
  31.             ii = ii + 1
  32.             aValue = rng.Cells(i, col1).Value
  33.         End If
  34.     Next
  35. End With
  36. Application.ScreenUpdating = True
  37. End Sub
复制代码

作者: 13545876873    时间: 2024-9-16 22:07

本帖最后由 13545876873 于 2024-9-18 17:12 编辑

回复 9# ppll2030
可以了呢
感谢大哥们的帮助


但是对于9万多行的excel表来说,运算太慢了
作者: 13545876873    时间: 2024-9-16 22:10

本帖最后由 13545876873 于 2024-9-18 17:40 编辑

回复 10# aloha20200628
哦哦
作者: 13545876873    时间: 2024-9-16 22:24

本帖最后由 13545876873 于 2024-9-18 17:40 编辑

回复 11# flashercs
这个也可以,但宏针多数万行的excel数据,运行有点慢
谢谢大哥!
作者: 13545876873    时间: 2024-9-16 22:32

本帖最后由 13545876873 于 2024-9-16 22:33 编辑

回复 10# aloha20200628
大哥,修改后的test.bat , 出来的11.csv和2.csv,都是空白呢

1.csv的内容和5楼一样哈
作者: aloha20200628    时间: 2024-9-16 23:23

回复 15# 13545876873

1.csv 似乎超出 sort.exe 的最大排序长度,致使 11.csv 未能成功创建... 只好在 excel 里先按A列排序后再输出 1.csv 了... 代码还须用第一版,如下:
  1. @echo off &setlocal enabledelayedexpansion
  2. (for /f "delims=" %%A in (1.csv) do for /f "tokens=1-2* delims=," %%a in ("%%~A") do (
  3. if "%%~a"=="!_a!" if %%b gtr !_b! set "v=%%A"
  4. if "%%~a" neq "!_a!" if defined v echo,!v!&set "_b=" &set "v="
  5. set "_a=%%a" &if not defined _b set "_b=%%b" &if not defined v set "v=%%A"
  6. )
  7. if defined v echo,!v!)>2.csv
  8. endlocal&pause&exit/b
复制代码

作者: 13545876873    时间: 2024-9-17 08:17

回复 16# aloha20200628
哦哦!谢谢大哥
作者: aloha20200628    时间: 2024-9-17 11:22

本帖最后由 aloha20200628 于 2024-9-17 11:34 编辑

回复 15# 13545876873

复查了有关 sort.exe 的参数说明,其中 /rec 用于设置排序最大行长度,默认=4096 每行字符量,楼主实际用的 1.csv 已经超过这个默认值了,因此会报警 ‘输入记录超过最大长度。请指定更大的最大限度。’ 解决方法是将该值设为 8192,此值也是批处读取每行文本字符量的极限(sort 允许此值高达 64K 但对批处的极限能力已无意义)。据此重新订正了3楼代码,如 1.csv 的最大行长度不超过 8192 字符量,即可用3楼代码再试一试...

作者: 13545876873    时间: 2024-9-18 17:01

本帖最后由 13545876873 于 2024-9-18 17:34 编辑

回复 16# aloha20200628
大哥,好像有一点bug呀 ,  我第一次针对3万8千多行的excel数据使用,复制出来了2万多一点;  但还是有一些没复制出来, 于是我把没复制出来的新建一个表再运行一次test.bat,结果这次只复制出来两个
表1有很多数据(已经排过序了的),只复制出来了两个(第一个复制还不是最大的):
这是网盘地址,大哥有空帮忙看看呀https://wwfe.lanzoue.com/iM2U42a9b4cj
密码:6kto

我发现一个问题,我第一次筛出来2万多行的B列数值,都在6000以下。 第二次出来的数值也是6000以下的, 6000以上的都没出来,不知为啥
作者: flashercs    时间: 2024-9-18 20:09

回复 18# 13545876873


在Windows命令行界面(CMD)中,命令行的最大长度是有限制的。根据微软的技术文档,命令行的最大长度为 8191 字符。这包括命令本身以及所有传递给命令的参数。
如果csv行长度太长就不会输出.
作者: ppll2030    时间: 2024-9-18 20:58

回复 18# 13545876873


    你的表格中,基因序列和蛋白序列的内容太长了。随便删掉一列估计就行了

这么大的数据量,还是老老实实用excel处理吧,
你可以把我的步骤录制成宏保存起来,或者把10楼大佬的vba添加到模块中,使用的时候直接导入点击,等个几十秒即可完成了。
作者: buyiyang    时间: 2024-9-18 23:27

追求速度的话,试试gawkhttp://bcn.bathome.net/tool/5.1.0/gawk.exe
  1. gawk -F"," "BEGIN{max[\"\"]=-999999}{if($2 ~ /^[0-9]+$/){if($2>max[$1]){max[$1]=$2;line[$1]=$0}}else{print}}END{for(key in line){print line[key]}}" 1.csv >2.csv
复制代码

作者: aloha20200628    时间: 2024-9-19 00:04

本帖最后由 aloha20200628 于 2024-9-19 08:57 编辑

回复 18# 13545876873

再给楼主一个版本吧 请出 sort76.exe 和 jscript 保驾护航,可以轻松越过批处理读写每行8192字符量的大限... 以下代码存为 test.bat 运行,先从本坛第三方下载 sort.exe R7.6版 ( http://bcn.bathome.net/tool/7.6/sort.exe ) 更名为 sort76.exe 与 test.bat 同目录
  1. @set @v=1 /* &echo off & sort76 -t "," -k1,1 -k2n,2 1.csv|cscript /nologo /e:jscript "%~f0">2.csv
  2. pause&exit/b */
  3. ws=WSH.stdin, _s='', _s1='';
  4. while (!ws.atendofstream) {
  5. s=ws.readline(), ac=s.split(',');
  6. if (ac[0] != _s1 && _s1 != '') WSH.echo(_s);
  7. _s=s, _s1=ac[0];
  8. }
  9. WSH.echo(_s), WSH.quit();
复制代码

作者: czjt1234    时间: 2024-9-19 08:32

我也来练练手,用楼主提供的 1.csv 另存为 1.xlsx
就是说直接读取 excel 文件,不用先转换为 csv 再读取
用数据库SQL语言统计结果
win7x64测试通过
  1. rem 另存为 ANSI 编码 bat
  2. ' & cls & %windir%\SysWOW64\cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit /b
  3. f1 = "1.xlsx"    '源文件
  4. f2 = "2.csv"     '输出文件
  5. s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & f1 & ";Extended Properties='Excel 12.0 Xml;HDR=YES'"
  6. Set oConnection = CreateObject("ADODB.Connection")
  7. oConnection.Open s
  8. Set oRecordset = oConnection.OpenSchema(20)    'adSchemaTables
  9. Do Until oRecordset.EOF = True
  10.     Select Case oRecordset("TABLE_TYPE")
  11.         Case "TABLE"
  12.             s = oRecordset("TABLE_NAME")
  13.     End Select
  14.     oRecordset.MoveNext()
  15. Loop
  16. oRecordset.Close()
  17. Set oRecordset = CreateObject("ADODB.Recordset")
  18. oRecordset.CursorLocation = 3    'adUseClient
  19. oRecordset.Open "SELECT 基因名称, MAX(基因长度) AS 基因长度 FROM [" & s & "] GROUP BY 基因名称", oConnection
  20. s = ""
  21. For i = 0 To oRecordset.Fields.Count - 1
  22.     s = s & oRecordset(i).Name & ","
  23. Next
  24. s = Left(s, Len(s) - 1) & vbCrLf
  25. Do Until oRecordset.EOF = True
  26.     For i = 0 To oRecordset.Fields.Count - 1
  27.         s = s & oRecordset(i).Value & ","
  28.     Next
  29.     s = Left(s, Len(s) - 1) & vbCrLf
  30.     oRecordset.MoveNext()
  31. Loop
  32. oRecordset.Close()
  33. Set oFSO = CreateObject("Scripting.FileSystemObject")
  34. Set oTextStream = oFSO.OpenTextFile(f2, 2, True)
  35. oTextStream.Write s
  36. oTextStream.Close()
  37. wsh.Echo "ok"
复制代码

作者: 13545876873    时间: 2024-9-19 09:31

回复 19# flashercs
哦,是这样啊
作者: 13545876873    时间: 2024-9-19 09:34

回复 20# ppll2030
这样也行,只是时间长一些, 昨天用2楼大哥的excel函数,处理了一晚没关电脑,今天早上处理好了
作者: czjt1234    时间: 2024-9-19 09:42

回复 25# 13545876873


    要速度的话,应该是21楼的第三方软件最快
作者: 13545876873    时间: 2024-9-19 09:45

回复 21# buyiyang
谢谢大哥,我的电脑好像安装不了这个,下载下来双击后,cmd窗口一闪而过
作者: 13545876873    时间: 2024-9-19 09:54

回复 22# aloha20200628
感谢大哥,这个可以,都复制出来了
作者: 13545876873    时间: 2024-9-19 09:58

回复 23# czjt1234
感谢大哥,这个也可以




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2