Board logo

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

作者: mdzzx    时间: 2023-7-6 09:44     标题: 求助批处理判断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里边只有一个数字  就删除
两个及以上就保留
求大佬解答
作者: Batcher    时间: 2023-7-6 09:51

回复 1# mdzzx


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

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: qixiaobin0715    时间: 2023-7-6 10:13

楼主关于类的描述就把别人绕晕了。
作者: mdzzx    时间: 2023-7-6 10:45

回复 3# qixiaobin0715


    抱歉  哈哈哈
作者: Batcher    时间: 2023-7-6 16:37

回复 1# mdzzx


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

这两个文件打包上传到网盘
作者: qixiaobin0715    时间: 2023-7-6 16:37

本帖最后由 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
复制代码
未仔细考虑,可能有误。请备份好源文件,以免发生意外。
作者: dimo    时间: 2023-7-14 17:49

回复 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
复制代码
结果测试之后把内容都删光了……
作者: dimo    时间: 2023-7-14 20:25

本帖最后由 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列来搜索,然后标记行号,
但是就太麻烦了,我就没写出来,这个应该有更好的方法吧
作者: qixiaobin0715    时间: 2023-7-15 08:35

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




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