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

[文本处理] 求助批处理判断csv文件列,然后删除某一些不符合的数据

batch   source  time  lat  这是列
比如 source 列下  有 9001  9002 两类
https://imgse.com/i/pC6l51e
选择9001   batch下对应的有 10 和12 两类  所以就保留  
https://imgse.com/i/pC6l4pD
选择9002  batch下只有1 所以 数据全部删除
https://imgse.com/i/pC6lb7t
先通过筛选 选择source下的某一个数据 如果batch里边只有一个数字  就删除
两个及以上就保留
求大佬解答

回复 1# mdzzx


请给一个真实的例子说明一下你的需求吧,比如操作之前是怎样的,操作之后变成啥样?
如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

楼主关于类的描述就把别人绕晕了。

TOP

回复 3# qixiaobin0715


    抱歉  哈哈哈

TOP

回复 1# mdzzx


请找一部分数据作为例子,把:
处理前.csv
处理后.csv

这两个文件打包上传到网盘
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 qixiaobin0715 于 2023-7-15 09:15 编辑

假设前两列都是自然数,各列都是以英文逗号分隔:
  1. @echo off
  2. (for /f "tokens=1,2 delims=," %%i in (1.csv) do (
  3.      if defined _%%j (
  4.         if not defined #%%i echo,[0-9]*,%%j,
  5.     )
  6.     set #%%i=true
  7.     set _%%j=true
  8. ))>log
  9. (echo,batch,source,time,lat
  10. findstr /b /g:log 1.csv)>temp
  11. type temp>1.csv
  12. del log temp
复制代码
未仔细考虑,可能有误。请备份好源文件,以免发生意外。

TOP

回复 6# qixiaobin0715
我自己生成了一个csv用来测试,这个应该符合要求。
  1. batch,source,time,lat
  2. 12,9001,0.024632866,0.905915485
  3. 1,9002,0.782254972,0.457675474
  4. 12,9001,0.149382191,0.533533094
  5. 10,9001,0.522246607,0.0429526
  6. 12,9001,0.355786377,0.995325435
  7. 12,9001,0.416155121,0.436677966
  8. 10,9001,0.122666718,0.401502167
  9. 10,9001,0.001995224,0.132484873
  10. 10,9001,0.578341874,0.848645374
  11. 1,9002,0.624128442,0.995400678
  12. 10,9001,0.057870604,0.011974136
  13. 1,9002,0.195745245,0.441528805
  14. 12,9001,0.392076483,0.381371589
复制代码
结果测试之后把内容都删光了……
Hope is a sad thing.
https://nsdimo.gitee.io/

TOP

本帖最后由 dimo 于 2023-7-15 21:30 编辑

我也就这个思路,就是一遍遍循环去检测。
  1. set csv=1.csv
  2. echo off
  3. set n=0
  4. cd /d "%~dp0%"
  5. setlocal enabledelayedexpansion
  6. del temp.tmp
  7. for /f "skip=1 tokens=2 delims=," %%i in (%csv%) do (
  8. set exist=0
  9. for /f "delims=" %%n in (temp.tmp) do if "%%n"=="%%i" set exist=1
  10. if !exist!==0 echo %%i>> temp.tmp
  11. )
  12. for /f "delims=" %%n in (temp.tmp) do (
  13. set delete=1
  14. set pre=
  15. for /f "skip=2 tokens=1 delims=," %%i in ('find ",%%n," %csv%') do (
  16. if not defined pre set pre=%%i
  17. if not "%%i"=="!pre!" set delete=0
  18. )
  19. if !delete!==1 call :delcsv %%n
  20. )
  21. pause
  22. del temp.tmp
  23. exit
  24. :delcsv
  25. echo off
  26. (for /f "skip=2 delims=" %%d in ('find /v ",%1," %csv%') do echo %%d)>> newcsv.csv
  27. del %csv%
  28. ren newcsv.csv %csv%
  29. goto :eof
复制代码
现在问题可能就是,含有source的行可能匹配不准,
我想到的解决方法就是用行数来检测,可以用for截取source列来搜索,然后标记行号,
但是就太麻烦了,我就没写出来,这个应该有更好的方法吧
Hope is a sad thing.
https://nsdimo.gitee.io/

TOP

回复 7# dimo
变量设置搞反了。6楼代码已修改
1

评分人数

    • dimo: 乐于助人技术 + 1

TOP

返回列表