标题: [文本处理] [已解决]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 同目录...
- @echo off &setlocal enabledelayedexpansion
- sort /rec 8192 1.csv /o 11.csv
- (for /f "delims=" %%A in (11.csv) do for /f "tokens=1-2 delims=," %%a in ("%%~A") do (
- if "%%~a"=="!_a!" if %%b gtr !_b! set "v=%%A"
- if "%%~a" neq "!_a!" if defined v echo,!v!&set "_b=" &set "v="
- set "_a=%%a" &if not defined _b set "_b=%%b" &if not defined v set "v=%%A"
- )
- if defined v echo,!v!)>2.csv
- ::del /q 1.csv 11.csv
- 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宏- Sub SortAndFilter()
- ' Order by Column A Asc,B Desc,and select B Max value rows into Sheet2.
- On Error Resume Next
- Dim rng As Range, oSort As Sort, sht1 As Worksheet, sht2 As Worksheet, i As Long, ii As Long
- Dim col1, col2, aValue
- col1 = 1 ' 第一列,有重复值
- col2 = 2 ' 第二列,取最大值
- Application.ScreenUpdating = False
- With ThisWorkbook
- Set sht1 = .Worksheets(1)
- Set sht2 = .Worksheets.Add(After:=.Worksheets(.Worksheets.Count))
- Set rng = sht1.UsedRange
- Set oSort = sht1.Sort
- With oSort
- .SortFields.Clear
- .SortFields.Add rng.Columns(col1), xlSortOnValues, xlAscending
- .SortFields.Add rng.Columns(col2), xlSortOnValues, xlDescending
- .SetRange rng
- .Header = xlYes
- .MatchCase = False
- .SortMethod = xlPinYin
- .Apply
- End With
- rng.Rows(1).Copy sht2.Rows(1)
- ii = 2
- aValue = Null
- For i = 2 To rng.Rows.Count
- If IsNull(aValue) Or aValue <> rng.Cells(i, col1).Value Then
- 'copy this row
- rng.Rows(i).Copy sht2.Cells(ii, 1)
- ii = ii + 1
- aValue = rng.Cells(i, col1).Value
- End If
- Next
- End With
- Application.ScreenUpdating = True
- 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 了... 代码还须用第一版,如下:
- @echo off &setlocal enabledelayedexpansion
- (for /f "delims=" %%A in (1.csv) do for /f "tokens=1-2* delims=," %%a in ("%%~A") do (
- if "%%~a"=="!_a!" if %%b gtr !_b! set "v=%%A"
- if "%%~a" neq "!_a!" if defined v echo,!v!&set "_b=" &set "v="
- set "_a=%%a" &if not defined _b set "_b=%%b" &if not defined v set "v=%%A"
- )
- if defined v echo,!v!)>2.csv
- 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- 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 同目录
- @set @v=1 /* &echo off & sort76 -t "," -k1,1 -k2n,2 1.csv|cscript /nologo /e:jscript "%~f0">2.csv
- pause&exit/b */
- ws=WSH.stdin, _s='', _s1='';
- while (!ws.atendofstream) {
- s=ws.readline(), ac=s.split(',');
- if (ac[0] != _s1 && _s1 != '') WSH.echo(_s);
- _s=s, _s1=ac[0];
- }
- WSH.echo(_s), WSH.quit();
复制代码
作者: czjt1234 时间: 2024-9-19 08:32
我也来练练手,用楼主提供的 1.csv 另存为 1.xlsx
就是说直接读取 excel 文件,不用先转换为 csv 再读取
用数据库SQL语言统计结果
win7x64测试通过- rem 另存为 ANSI 编码 bat
- ' & cls & %windir%\SysWOW64\cscript.exe /nologo /e:vbscript "%~f0" %* & pause & exit /b
-
- f1 = "1.xlsx" '源文件
- f2 = "2.csv" '输出文件
-
- s = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & f1 & ";Extended Properties='Excel 12.0 Xml;HDR=YES'"
- Set oConnection = CreateObject("ADODB.Connection")
- oConnection.Open s
- Set oRecordset = oConnection.OpenSchema(20) 'adSchemaTables
- Do Until oRecordset.EOF = True
- Select Case oRecordset("TABLE_TYPE")
- Case "TABLE"
- s = oRecordset("TABLE_NAME")
- End Select
- oRecordset.MoveNext()
- Loop
- oRecordset.Close()
- Set oRecordset = CreateObject("ADODB.Recordset")
- oRecordset.CursorLocation = 3 'adUseClient
- oRecordset.Open "SELECT 基因名称, MAX(基因长度) AS 基因长度 FROM [" & s & "] GROUP BY 基因名称", oConnection
- s = ""
- For i = 0 To oRecordset.Fields.Count - 1
- s = s & oRecordset(i).Name & ","
- Next
- s = Left(s, Len(s) - 1) & vbCrLf
- Do Until oRecordset.EOF = True
- For i = 0 To oRecordset.Fields.Count - 1
- s = s & oRecordset(i).Value & ","
- Next
- s = Left(s, Len(s) - 1) & vbCrLf
- oRecordset.MoveNext()
- Loop
- oRecordset.Close()
- Set oFSO = CreateObject("Scripting.FileSystemObject")
- Set oTextStream = oFSO.OpenTextFile(f2, 2, True)
- oTextStream.Write s
- oTextStream.Close()
- 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://bathome.net./) |
Powered by Discuz! 7.2 |