[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

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

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

TOP

回复 22# aloha20200628
感谢大哥,这个可以,都复制出来了

TOP

回复 21# buyiyang
谢谢大哥,我的电脑好像安装不了这个,下载下来双击后,cmd窗口一闪而过

TOP

回复 25# 13545876873


    要速度的话,应该是21楼的第三方软件最快

QQ 20147578

TOP

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

TOP

回复 19# flashercs
哦,是这样啊

TOP

我也来练练手,用楼主提供的 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"
复制代码
2

评分人数


QQ 20147578

TOP

本帖最后由 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();
复制代码
1

评分人数

TOP

追求速度的话,试试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
复制代码
1

评分人数

TOP

回复 18# 13545876873


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

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

评分人数

TOP

回复 18# 13545876873


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

评分人数

微信:flashercs
QQ:49908356

TOP

本帖最后由 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以上的都没出来,不知为啥

TOP

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

回复 15# 13545876873

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

TOP

回复 16# aloha20200628
哦哦!谢谢大哥

TOP

返回列表