标题: [文本处理] 批处理如何根据两个文本的前两列内容按指定条件提取相应数据行 [打印本页]
作者: newbat123 时间: 2016-11-29 16:32 标题: 批处理如何根据两个文本的前两列内容按指定条件提取相应数据行
如何根据两列条件筛选数据
有文件夹AB 里面个有很多txt,现在各去一个txt文件说明
A文件中,第一列是日期,第二列是时间,后面各列是数据,但随即出现,不是每行都有数据,也不是每行都有一样多的数据
即 将文件A中第2列之后的每一列都是空的“空行”筛选出来,存为文件1,其余的存为文件2.
然后,以文件1中筛选出来的数据(即包含有时间和日期两列数据的文本数据)为标准,找出文件B中前两列与之匹配的行数据存为文件3,其余的存为文件4。
经过大家提醒 已经把excel转化成txt了,请问可以利用批处理完成吗?
作者: GNU 时间: 2016-11-29 21:59
请把以下文件作为例子打包压缩传上来:
A文件
B文件
文件1
文件2
文件3
文件4
作者: newbat123 时间: 2016-11-30 09:11
回复 3# GNU
好的
作者: happy886rr 时间: 2016-11-30 09:53
本帖最后由 happy886rr 于 2016-11-30 10:02 编辑
回复 1# newbat123
推荐用我写的RF工具,下载 http://www.bathome.net/thread-42266-1-1.html
完全pcre高级正则,回车换行都可匹配,兼容各种文本编码。- @echo off
- REM 将文件A中第2列之后的每一列都是空的“空行”筛选出来,存为文件1
- rf /f /r:"^[0-9:]+[ \t]+[^ |\t]+[ |\t]*[\r\n]$" A>1
-
- REM 其余的存为文件2.
- rf /v /r:"^[0-9:]+[ \t]+[^ |\t]+[ |\t]*[\r\n]$" A>2
-
- pause
复制代码
作者: CommandBatCmd 时间: 2016-11-30 14:26
回复 1# newbat123
你试试,看看结果,是否能解决问题
在P文中用gawk处理,gawk下载:http://www.bathome.net/s/tool/index.html?down&key=gawk- @echo off&Title 测试
- set a=a2014.11.15.txt
- set b=b2014.11.15.txt
- set #1=1.txt
- set #2=2.txt
- set #3=3.txt
- set #4=4.txt
- CALL :_A&CALL :_B
- gawk "{if(NR==1){print $0 >\"%#1%\";print $0 >\"%#2%\"}else{if($3==null){print $0 >\"%#1%\"}else{print $0 >\"%#2%\"}}}" "%a%"
- gawk "{if(NR==1){print $0 >\"%#3%\";print $0 >\"%#4%\";exit}}" "%b%"
- gawk "{if(FNR>1){print $0}}" "%#1%" "%b%"|gawk "{if(!($1$2 in a)){ a[$1$2];print >>\"%#4%\"}else{print >>\"%#3%\"}}"
- gawk "/.*/" "%#4%"|gawk "{if($3!=null){print >\"%#4%\"}}"
- pause&exit
-
- :_A
- (
- echo 廓线日期 廓线时间 数据1 数据2 数据3 数据4 数据5 数据6 数据7 数据8 数据9 数据10 数据11 数据12 数据13 数据14 数据15 数据16 数据17 数据18 数据19 数据20 数据21 数据22 数据23
- echo 11/02/2014 12:27:55
- echo 11/02/2014 22:37:54
- echo 11/05/2014 02:07:48 10.4628 10.2529 9.98309
- echo 11/05/2014 02:12:48 10.4628 10.2229 9.83319
- echo 11/05/2014 02:17:48
- echo 11/05/2014 02:22:48 10.3428 10.103 9.62334
- )>"%a%"
- goto :eof
- :_B
- (
- echo 廓线日期 廓线时间 OH1 OH2 OH3 OH4 OH5 OH6 OH7 OH8 OH9 OH10 OH11 OH12 OH13 OH14 OH15 OH16
- echo 11/02/2014 12:27:55 0.359751
- echo 11/02/2014 12:37:55 0.359751
- echo 11/02/2014 12:42:55 0.359751 1.88869
- echo 11/02/2014 12:47:55 0.359751
- echo 11/05/2014 02:17:48 0.359751 1.94865
- echo 11/02/2014 13:02:55 0.38973
- echo 11/06/2014 07:17:44 0.359751
- )>"%b%"
- goto :eof
复制代码
作者: newbat123 时间: 2016-11-30 14:44
回复 5# CommandBatCmd
数据因为太大,这是我截选的一小部分,所以不能按照这个程序运行
作者: newbat123 时间: 2016-11-30 14:45
回复 4# happy886rr
解压不出来
作者: CommandBatCmd 时间: 2016-11-30 15:10
回复 7# newbat123
A文件与B文件,不是文本文件吗?
这两个文件最大有多少GB?
作者: newbat123 时间: 2016-11-30 15:12
回复 8# CommandBatCmd
是excel文件,因为文件太多,希望能够有批处理
作者: CommandBatCmd 时间: 2016-11-30 15:19
回复 9# newbat123
你的意思是用批处理直接操作excel文件?还是怎样的?
作者: newbat123 时间: 2016-11-30 15:21
回复 10# CommandBatCmd
恩恩,是的是的 ,如果不可以的话,我可以把excel转成txt?
作者: CommandBatCmd 时间: 2016-11-30 15:21
回复 11# newbat123
excel文件是二进制文件,需要保持为文本文件才能被其他程序处理啊
作者: newbat123 时间: 2016-11-30 15:32
回复 12# CommandBatCmd
那我自己先处理成txt吧
作者: happy886rr 时间: 2016-11-30 16:01
回复 13# newbat123
你直接用excel的宏命令编程就能解决,批处理不肯能直接处理excel,excel自带宏命令编程。
作者: 523066680 时间: 2016-11-30 16:34
1. 难道是 csv
2. 各位答主真是大好人。
作者: newbat123 时间: 2016-11-30 18:48
回复 14# happy886rr
恩,是的,我已经把所有excel转换成了txt ,请问可以用批处理了吗?
作者: newbat123 时间: 2016-11-30 18:49
回复 12# CommandBatCmd
谢谢提醒,我已经把excel全部化成txt了
作者: CommandBatCmd 时间: 2016-11-30 19:25
回复 17# newbat123 - @echo off
- set a=A文件.txt&@rem 修改为第一个文件名
- set b=B文件.txt&@rem 修改为第二个文件名
- set #1=1.txt&set #2=2.txt&set #3=3.txt&set #4=4.txt
- echo 开始:%date% %time%
- gawk "{if(NR==1){print $0 >\"%#1%\";print $0 >\"%#2%\"}else{if($3==null){print $0 >\"%#1%\"}else{print $0 >\"%#2%\"}}}" "%a%"
- gawk "{if(NR==1){print $0 >\"%#3%\";print $0 >\"%#4%\";exit}}" "%b%"
- gawk "{if(FNR>1){print $0}}" "%#1%" "%b%"|gawk "{if(!($1$2 in a)){ a[$1$2];print >>\"%#4%\"}else{print >>\"%#3%\"}}"
- gawk "/.*/" "%#4%"|gawk "{if($3!=null){print >\"%#4%\"}}"
- echo 结束:%date% %time%
- pause&exit
复制代码
作者: newbat123 时间: 2016-12-1 14:08
回复 18# CommandBatCmd
不好意思,我试了您的程序,没出来结果。
作者: CommandBatCmd 时间: 2016-12-1 14:39
回复 19# newbat123
保存为以下三种都是文本文件格式,但要保存为1.、3.这两种,
1. CSV (逗号分隔)(*.csv)
2. Unicode 文本(*.txt)
3. 文本文件(制表符分隔)(*.txt)
如果保存为第一种,把gawk后添加参数 -F"," (逗号分隔) 或者在程序内添加【FS=","】
如果保存为第三种,程序可以直接处理的啊?
怎么样的没结果或把无法处理的结果贴出来让大家看看
作者: newbat123 时间: 2016-12-1 15:00
回复 20# CommandBatCmd
保存的是第3种,就是运行的时候,就直接闪退了,来不及保存
作者: CommandBatCmd 时间: 2016-12-1 15:21
回复 21# newbat123
用上面的程序刚才测试了你上传的文件,没有发现闪退,并且结果也正确。
你用的gawk是3.1.6以上的吗?什么系统?32位或64位?把修改后的代码贴出来看看。
作者: newbat123 时间: 2016-12-1 15:46
回复 22# CommandBatCmd
好的 ,我再试试
作者: pcl_test 时间: 2016-12-1 15:58
把批处理跟“文本a.txt”“文本b.txt”放在一起运行- @echo off
- 2>nul del $*.log
- set "fa=文本a.txt"
- set "fb=文本b.txt"
- for /f "skip=1 delims=" %%a in ('type "%fa%"') do (
- for /f "tokens=1,2*" %%b in ("%%a") do (
- if "%%d" equ "" (
- >>"$1.log" echo;%%a
- set #%%b%%c=1
- ) else >>"$2.log" echo;%%a
- )
- )
- for /f "delims=" %%a in ('type "%fb%"') do (
- for /f "tokens=1,2*" %%b in ("%%a") do (
- if defined #%%b%%c (
- >>"$3.log" echo;%%a
- ) else >>"$4.log" echo;%%a
- )
- )
- pause
复制代码
作者: newbat123 时间: 2016-12-6 13:05
回复 24# pcl_test
你的程序通过 只是需要一个一个的合并在一起
作者: newbat123 时间: 2016-12-6 13:06
回复 24# pcl_test
已通过运行,十分感谢
作者: newbat123 时间: 2016-12-6 13:07
回复 18# CommandBatCmd
已通过运行,十分感谢
作者: newbat123 时间: 2017-4-3 18:34
回复 24# pcl_test 反复试验之后 发现还是有问题 就是当挑选出1,2文件之后,却不能按照1中的文件完全挑出3,4 是相互混杂的!!
作者: newbat123 时间: 2017-4-3 19:09
回复 15# 523066680 的确是csv,希望能用批处理解决
作者: pcl_test 时间: 2017-4-3 19:53
回复 28# newbat123
把你测试用的源文件xls和转换后的txt或csv文件用网盘分享出来
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |