标题: [文本处理] 求助批处理判断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 编辑
假设前两列都是自然数,各列都是以英文逗号分隔:- @echo off
- (for /f "tokens=1,2 delims=," %%i in (1.csv) do (
- if defined _%%j (
- if not defined #%%i echo,[0-9]*,%%j,
- )
- set #%%i=true
- set _%%j=true
- ))>log
- (echo,batch,source,time,lat
- findstr /b /g:log 1.csv)>temp
- type temp>1.csv
- del log temp
复制代码
未仔细考虑,可能有误。请备份好源文件,以免发生意外。
作者: dimo 时间: 2023-7-14 17:49
回复 6# qixiaobin0715
我自己生成了一个csv用来测试,这个应该符合要求。- batch,source,time,lat
- 12,9001,0.024632866,0.905915485
- 1,9002,0.782254972,0.457675474
- 12,9001,0.149382191,0.533533094
- 10,9001,0.522246607,0.0429526
- 12,9001,0.355786377,0.995325435
- 12,9001,0.416155121,0.436677966
- 10,9001,0.122666718,0.401502167
- 10,9001,0.001995224,0.132484873
- 10,9001,0.578341874,0.848645374
- 1,9002,0.624128442,0.995400678
- 10,9001,0.057870604,0.011974136
- 1,9002,0.195745245,0.441528805
- 12,9001,0.392076483,0.381371589
复制代码
结果测试之后把内容都删光了……
作者: dimo 时间: 2023-7-14 20:25
本帖最后由 dimo 于 2023-7-15 21:30 编辑
我也就这个思路,就是一遍遍循环去检测。- set csv=1.csv
- echo off
- set n=0
- cd /d "%~dp0%"
- setlocal enabledelayedexpansion
- del temp.tmp
- for /f "skip=1 tokens=2 delims=," %%i in (%csv%) do (
- set exist=0
- for /f "delims=" %%n in (temp.tmp) do if "%%n"=="%%i" set exist=1
- if !exist!==0 echo %%i>> temp.tmp
- )
-
- for /f "delims=" %%n in (temp.tmp) do (
- set delete=1
- set pre=
- for /f "skip=2 tokens=1 delims=," %%i in ('find ",%%n," %csv%') do (
- if not defined pre set pre=%%i
- if not "%%i"=="!pre!" set delete=0
- )
- if !delete!==1 call :delcsv %%n
- )
-
- pause
- del temp.tmp
- exit
-
- :delcsv
- echo off
- (for /f "skip=2 delims=" %%d in ('find /v ",%1," %csv%') do echo %%d)>> newcsv.csv
- del %csv%
- ren newcsv.csv %csv%
- goto :eof
复制代码
现在问题可能就是,含有source的行可能匹配不准,
我想到的解决方法就是用行数来检测,可以用for截取source列来搜索,然后标记行号,
但是就太麻烦了,我就没写出来,这个应该有更好的方法吧
作者: qixiaobin0715 时间: 2023-7-15 08:35
回复 7# dimo
变量设置搞反了。6楼代码已修改
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |