标题: [文本处理] 求助大神,利用批处理将原始txt中的多段内容提取出来,并分别保存为多个txt [打印本页]
作者: hlyahs 时间: 2018-8-11 09:49 标题: 求助大神,利用批处理将原始txt中的多段内容提取出来,并分别保存为多个txt
原始txt内容如下所示
请问能否利用批处理,每出现一次TPV_********,就将该行下面的内容保存至另一个txt中,而该txt名称即为所对应的TPV_********。
批处理后希望得到如下效果:
txt保存名字为“TPV_1979020212_86.08_35.11 3.txt”,txt内容打开为:
1979-02-02 12:00:00 86.08 35.11 5583.00 272.28 166762.15 16 4.87 6.95 658272.4 4.67 1.86
1979-02-02 18:00:00 89.54 35.35 5584.00 252.77 152875.85 15 4.78 9.39 532490.2 2.69 0.72
1979-02-03 00:00:00 92.41 35.86 5579.00 186.03 81081.03 9 3.52 5.09 356971.3 1.98 0.68
下一个txt保存名字为“TPV_1979020618_72.24_32.73 8.txt”, 打开内容为:
1979-02-06 18:00:00 72.24 32.73 5636.00 225.53 145213.88 14 4.64 6.02 660369.5 4.57 -0.13
1979-02-07 00:00:00 73.02 32.01 5620.00 419.66 497871.24 47 3.48 8.29 2035505.2 12.06 -2.96
1979-02-07 06:00:00 77.01 29.96 5639.00 373.27 416100.30 42 3.29 6.43 1442648.0 7.20 -3.50
1979-02-07 12:00:00 79.94 31.01 5620.00 566.49 955620.02 93 2.23 10.50 2788722.2 14.33 -3.29
1979-02-07 18:00:00 85.43 33.00 5623.00 387.92 406920.88 41 2.48 10.23 1213683.2 11.42 -0.29
1979-02-08 00:00:00 87.01 33.00 5603.00 405.04 503385.08 49 2.56 10.67 1752541.4 17.43 0.67
1979-02-08 06:00:00 91.36 33.08 5612.00 392.70 462576.83 47 3.08 11.12 2136844.4 19.11 0.73
1979-02-08 12:00:00 89.47 33.00 5600.00 505.40 742310.00 73 2.55 12.85 2703889.9 28.78 0.57
以此类推,将文本中所有的TPV_*****后的内容保存为不同的txt文件,并将txt命名为对应的TPV_*****
感觉有些复杂,不知能否用批处理实现
真挚感谢各位大神!
作者: hlyahs 时间: 2018-8-11 11:35
:'(:'(:'(:'(
请问有人么~~~没有学过批处理,编程又是个渣渣,这数据处理起来太复杂,只能投靠各位了QAQ
作者: xczxczxcz 时间: 2018-8-11 15:11
把文本拖到批处理上。文本要 ansi 编码。- @echo off & setlocal EnableDelayedExpansion
-
- for /f "tokens=1-2*" %%a in ('type %1') do echo %%a|findstr /b /i /c:"TPV_">nul 2>nul && set "名称=%%a %%b" || echo %%a %%b %%c>>"!名称!.txt"
-
- pause & exit
复制代码
================================
作者: xczxczxcz 时间: 2018-8-11 15:21
用这个更简洁- @echo off & setlocal EnableDelayedExpansion
- for /f "delims=" %%a in ('type %1') do echo %%a|findstr /b /i /c:"TPV">nul 2>nul && set "名称=%%a" || echo %%a>>"!名称!.txt"
- pause & exit
复制代码
==============================
作者: hlyahs 时间: 2018-8-12 01:00
回复 4# xczxczxcz
您好!很感谢您提供帮助,我将您给出的语法copy保存为bat运行,用的是ansi编码,但报错提示命令语法不正确。请问您知道该如何解决么?
非常感谢您的帮助。
作者: hlyahs 时间: 2018-8-12 09:04
回复 4# xczxczxcz
大神您好,报错提示是这样的,用sublime text打开时,中文显示的是乱码,请问我是还有哪里需要修改么?地址,或名称之类的。之前没有接触过批处理,麻烦您了
作者: xczxczxcz 时间: 2018-8-12 10:28
本帖最后由 xczxczxcz 于 2018-8-12 10:34 编辑
回复 6# hlyahs
批处理 也要保存为 ansi 编码。 你的txt 也要保存 为 ansi 编码。
你如果 想要 对 utf 文本也能自动运行。可到本坛 下载 iconv.exe 放到系统目录下。或与 批处理放到一起。再在批处理中加一个判断。你的txt就可以是 utf8/ansi都可以。
http://batch-cn.qiniudn.com/tool/iconv.exe
作者: hlyahs 时间: 2018-8-12 11:01
回复 7# xczxczxcz
大神好,大神还在么?
我把要提取的txt保存成ansi编码后,再次运行bat还是提示语法有错误。
去下载您说的inconv.exe,电脑提示有病毒直接终止下载了,(ps,请问保存到系统目录下是值c盘widows里么?判断语句我不会写...)
大神,救救我这个渣渣吧QAQ,求不要嫌我烦orz
作者: xczxczxcz 时间: 2018-8-12 11:48
本帖最后由 xczxczxcz 于 2018-8-12 11:58 编辑
回复 8# hlyahs
把你的 txt 发来看下,偶测试没问题的。或者你把批处理中的 乱码部分改成相同的英文字符.
把中文改英文,- @echo off & setlocal EnableDelayedExpansion
- for /f "delims=" %%a in ('type %1') do echo %%a|findstr /i/c:"TPV">nul 2>&1 && set "str=%%a" || echo %%a>>"!str!.txt"
- pause & exit
复制代码
只要你的 txt 中没有中文字符.把 txt 拖到 批处理上。
那个 iconv.exe 没有毒。win10 defender 已查。偶是在官网下的 900多k的。
作者: xczxczxcz 时间: 2018-8-12 12:00
回复 8# hlyahs
你是不是直接双击批处理的。要把 txt 拖到 批处理 上再松开 就可以了。
作者: xczxczxcz 时间: 2018-8-12 12:14
直接双击批处理- @echo off & setlocal EnableDelayedExpansion
- del /q *.log>nul 2>nul
- for %%i in (*.txt) do for /f "delims=" %%a in ('type "%%i"') do echo %%a|findstr /i/c:"TPV">nul 2>&1 && set "str=%%a" || echo %%a>>"!str!.log"
- pause & exit
复制代码
作者: hlyahs 时间: 2018-8-12 15:52
回复 11# xczxczxcz
感动天地QAQ
我开始是双击的bat,原来是要把txt拖进去..蠢哭了我
然后,拆分以后,能再麻烦大神教我一个操作么
大神,我的txt不是拆分成很多个了么,每个txt里面有16列,请问能不能用批处理对所有文本第一行的倒数第二列进行判定,如果数字=1,保留该txt文本,如果数字=0,就把这个txt移动到其他文件夹中
txt打开是这样的,每个txt行数不同,列数相等
不过能把txt拆分开来我已经很感谢了!,大神不管我也没事QAQ,我也可以自己一个一个打开找………………也就几千个文本................要不大神你再救救我吧
啊啊啊啊啊,感觉自己脸皮好厚一直麻烦别人,但是为了生存Orz。。。
作者: xczxczxcz 时间: 2018-8-12 17:04
回复 12# hlyahs
先把你已分离出来的文件 放到任意一个文件里,再把该文件夹拖到批处理上。- @echo off & setlocal EnableDelayedExpansion
-
- md new>nul 2>nul
- for /f "delims=" %%a in ('dir/a-d/b "%~1\*.txt"') do (
- set /a n=0
- for /f "delims=" %%i in ('type "%~1\%%a"') do (
- set /a n+=1
- if !n! leq 1 (
- set "str=%%i"
- set "str=!str: =\!"
- for /f "delims=" %%m in ("!str!\..") do if /i "%%~nxm" == "0" move /y "%~1\%%a" "new\"
- )
- )
- )
- pause & exit
复制代码
作者: hlyahs 时间: 2018-8-13 00:23
回复 13# xczxczxcz
脚本可以使用,处理数据超级方便啊啊啊,我要哭了,谢谢耐心回答,大神你真的好好QAQ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
作者: hlyahs 时间: 2018-9-10 16:18
回复 13# xczxczxcz
大神您好,我又来打扰您了orz
之前请您帮忙处理筛选了txt,现在又遇到了一个小问题
就是我现在有很多个这样的txt,每个txt有固定的16列,但行数不一定相同。请问大神能不能用批处理,去判定每个txt的最后一列是否出现0,如果出现0的话,就将这部分txt复制到另一个文件夹中。
感谢大神无私的帮助Orz!期待您的回复...
作者: xczxczxcz 时间: 2018-9-11 20:55
最后一列全为0才会复制,不要牙膏。双击按提示操作。- @echo off & cd/d "%~dp0" & setlocal EnableDelayedExpansion
- echo 把【文件夹】拖到此窗口中,会处理子目录,非相关文件先移出再运行。
- echo;&set /p var=拖入文件夹,并回车:& CLS
- for /r "%var%" %%a in (*.txt) do ( for /f "delims=" %%a in ('type "%%a"') do (
- set "space=%%a" & set "space=!space: =/!"
- for /f "delims=" %%a in ("!space!") do if "%%~nxa" neq "0" set "#=#"
- )
- if not defined # ( xcopy /y "%%a" "0_Folder\">nul&&echo 复制 %%~nxa ) else set "#="
- )
- pause & exit
复制代码
作者: hlyahs 时间: 2018-9-11 22:18
回复 16# xczxczxcz
大神,感谢您的帮助,可是我的最后一列没有全部为0的,我需要的是最后一列只要出现一次0,就把这个txt筛选出来,不复制也可以,直接把它们挪到另一个文件夹中也行
大神求你帮帮我Orz,周五就要开组会了,我基础数据都还没有处理好,没办法进行下一步工作,泪奔QAQ
作者: hlyahs 时间: 2018-9-11 22:21
回复 16# xczxczxcz
啊啊啊啊!!!大神我白痴了,我突然反应过来只要把您给的bat改成识别最后一列全部都是1的,就可以筛选出存在0的列啦啦啦啦啦啦啦啦!
大神我先试试哈
作者: hlyahs 时间: 2018-9-11 22:50
回复 16# xczxczxcz
大神,我把您的这一句改成了for /f "delims=" %%a in ("!space!") do if "%%~nxa" neq "1" set "#=#",
想尝试把最后一列全部是1的提取出来,可是双击bat打开后,文件夹拖进去处理没有反应,等了一会变成了“按任意键继续”,但是没有处理结果出来。
大神,请问我是犯了什么错误么?
作者: xczxczxcz 时间: 2018-9-11 23:44
回复 19# hlyahs
没有错误,你的行尾有空格而已。这个比上个快些。话不要说模棱两可。- @echo off & cd/d "%~dp0" & setlocal EnableDelayedExpansion
- echo 把【文件夹】拖到此窗口中,会处理子目录,非相关文件先移出再运行。
- echo;&set /p var=拖入文件夹,并回车:& CLS
- for /r "%var%" %%a in (*.txt) do ( for /f "delims=" %%a in ('type "%%a"') do (
- set "space=%%~nxa" & set "space=!space: =/!"
- call :AAA "!space!" )
- if defined # ( xcopy /y "%%a" "0_Folder\">nul&&echo 复制 %%~nxa )
- )
- pause & exit
- :AAA
- set "#="
- for /f "delims=" %%a in ("%1") do (if "%%~nxa"=="0" set "#=#" &goto :eof )
复制代码
作者: hlyahs 时间: 2018-9-12 10:51
回复 20# xczxczxcz
我以后会更加准确的表达自己的问题的,谢谢大神提醒。
然后,大神,我……早上重新查看数据,意识到还需要进一步提取才能得到我最终需要的数据。
如下:
所有txt中的第3列,如果出现大于100的数字的话,就将该txt复制到另一个文件夹中。
我保证这是我近期最后一次打搅,谢谢大神你一直都在。
作者: xczxczxcz 时间: 2018-9-12 18:22
你MM的能不能把所有一次提出。本来一个批就可以搞定的。硬要用好几个?是行尾全部为0 还是部分为0,第三列是任意一个大于100,还是全部大于100。尾部为0和列大于100,是并集还交集还是什么的。你奶奶的就不能一次讲清楚?本来很简单的问题,硬是这么搞来搞去的。偶一向性格好的都受不鸟了。
作者: hlyahs 时间: 2018-9-12 18:57
回复 22# xczxczxcz
我需要的是第三列是任意一个大于100,就提取出来,复制到另一个文件夹。
对不起……因为我的提取是需要拆分开来的,不同提取的部分有不同的用处,需要分别保留。我一开始也没想到会有人愿意帮我那么多那么复杂的……
真的很抱歉,是我自己没有学好编程,才临时抱佛脚来寻求帮助。
大神请你不要凶我,我……我会更崩溃的,马上开组会才发现之前绘图脚本的检验一搞错了……但是还好有你一直帮我提取数据,至少我工作的前半部分可以顺利进行,我回头看了看,问了5次问题,你都在,真的很感谢你。
作者: Batcher 时间: 2018-9-12 19:21
回复 1# hlyahs
把原始txt文件压缩之后上传到顶楼,把所有的需求列个1、2、3、4、5也更新到顶楼,我来试试写个新的代码。
作者: Batcher 时间: 2018-9-12 19:23
回复 23# hlyahs
对你有帮助的代码,可以点击相应楼层右下角的“评分”来感谢作者
作者: xczxczxcz 时间: 2018-9-12 21:31
第三列任意一行有一个大于100时提取。不处理行尾的0/1。- @echo off & cd/d "%~dp0" & setlocal EnableDelayedExpansion
- echo 把【文件夹】拖到此窗口中,会处理子目录,非相关文件先移出再运行。
- echo;&set /p var=拖入文件夹,并回车:& CLS
-
- for /f "delims=" %%a in ('dir/a-d/b/s "%var%\*.txt"') do (
- call :BBB "%%a"
- if defined # ( xcopy /y "%%a" "3_100_Folder\">nul&&echo 复制 %%~nxa )
- set "#="
- )
- pause & exit
-
- :BBB
- for /f "tokens=3" %%i in ('type %1') do (
- for /f "tokens=1* delims=." %%a in ("%%~nxi") do if "%%b"=="" (set /a n1=%%a,n2=0) else (echo %%b)|findstr "[1-9]">nul 2>&1 && (set/a n1=%%a,n2=1) || (set/a n1=%%a,n2=0)
- if !n2! equ 0 (if !n1! gtr 100 (set "#=#" &goto :eof)) else if !n1! geq 100 (set "#=#"&goto :eof )
- )
复制代码
只是针对该贴写的。勿套用到其它地方。批中只针对是否大于100而处理。能较快出结果,未优化。
作者: hlyahs 时间: 2018-9-15 15:22
回复 24# Batcher
您好,感谢您的帮助,之前那位大神已经帮我写出程序了,很抱歉给您添麻烦了哈,谢谢~
作者: hlyahs 时间: 2018-9-15 15:24
回复 26# xczxczxcz
感谢您的帮助,问题已经解决了。
很抱歉打扰那么久,谢谢。
作者: 78785858 时间: 2018-9-15 16:07
我看完了。哈哈哈哈哈
作者: hlyahs 时间: 2018-9-15 22:44
回复 29# 78785858
QAQ!!!!!!!!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |