找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 22138|回复: 8

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

[复制链接]
发表于 2023-7-6 09:44:51 | 显示全部楼层 |阅读模式
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里边只有一个数字  就删除
两个及以上就保留
求大佬解答
发表于 2023-7-6 09:51:33 | 显示全部楼层
回复 1# mdzzx


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

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
发表于 2023-7-6 10:13:55 | 显示全部楼层
楼主关于类的描述就把别人绕晕了。
 楼主| 发表于 2023-7-6 10:45:01 | 显示全部楼层
回复 3# qixiaobin0715


    抱歉  哈哈哈
发表于 2023-7-6 16:37:30 | 显示全部楼层
回复 1# mdzzx


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

这两个文件打包上传到网盘
发表于 2023-7-6 16:37:59 | 显示全部楼层
本帖最后由 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
复制代码
未仔细考虑,可能有误。请备份好源文件,以免发生意外。
发表于 2023-7-14 17:49:03 | 显示全部楼层
回复 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
复制代码
结果测试之后把内容都删光了……
发表于 2023-7-14 20:25:47 | 显示全部楼层
本帖最后由 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列来搜索,然后标记行号,
但是就太麻烦了,我就没写出来,这个应该有更好的方法吧
发表于 2023-7-15 08:35:59 | 显示全部楼层
回复 7# dimo
变量设置搞反了。6楼代码已修改

评分

参与人数 1技术 +1 收起 理由
dimo + 1 乐于助人

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 19:44 , Processed in 0.020743 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表