标题: [文本处理] 批处理如何提取文本中第二列/第2列符合指定条件的行内容 [打印本页]
作者: 649918043 时间: 2017-3-7 22:39 标题: 批处理如何提取文本中第二列/第2列符合指定条件的行内容
本帖最后由 pcl_test 于 2017-3-8 22:24 编辑
求助!每行分2列需要整理每行中的第2列求助,每行以为(TAB)分列,
1:需要判断每行第2列,判断3个条件符合其1的都删除整行,1字符数不足八位,2全数字,3全英文的都删除整行,只保留第2列英文+数字的行
2:上述整理完后,仍然还需要判断是第2列 (英文+数字)中的英文字符其中是否有大写字母,(Abcd1234,abcD1234,1234abcD)如果带有大写就不管他,
如果没有的需要把整列中英文字母的首位 替换为大写字母。请大侠指导应该怎么写这个批处bat来整理这个文本.
总目的:需要把每行第2列,整理符合 标准(8位或8位以上,并包含大写,小写字母,包含数字)的条件为标准
下面说说具体列子
下面是文本列子
111.txt 下面是内容
vico624@aol.com bowling1
azn-jules@hotmail.com Juleschen58
outlawshooter55@aol.com Cherokee95
vi15852@yahoo.com.tw vi159753
oscar.lindroos@hotmail.com 13bertil
pabloparayno@yahoo.com 3210Koli
fleshgorewow@hotmail.com riverplate
nathan_tmoorthy@hotmail.com rex7771xk
lipe_eros@hotmail.com 15felipe
cywang926@hotmail.com 386qemm
nikola.vujke@hotmail.com 94vujke94
bjuncong_0128@hotmail.com love01280621
nnnja.23@hotmail.com blue1234
skyler.mutrie@hotmail.com prince18
breninjf_jf@hotmail.com 6451diy1
varrioth@hotmail.com 12stumpy69
tatoassoline@hotmail.com 11pedraum1
martinrafal@hotmail.com 10111994Martin
kuiperpieter@hotmail.com talpa123
Xx_saturos_xX@hotmail.com dmweb185
matrix_vi@hotmail.com g5vnse8i
需要整理完后 得到 文本222.txt 下面是整理完后内容
vico624@aol.com bowling1
azn-jules@hotmail.com Juleschen58
outlawshooter55@aol.com Cherokee95
vi15852@yahoo.com.tw Vi159753
oscar.lindroos@hotmail.com 13Bertil
pabloparayno@yahoo.com 3210Koli
nathan_tmoorthy@hotmail.com Rex7771xk
lipe_eros@hotmail.com 15Felipe
cywang926@hotmail.com 386Qemm
nikola.vujke@hotmail.com 94Vujke94
bjuncong_0128@hotmail.com Love01280621
nnnja.23@hotmail.com Blue1234
skyler.mutrie@hotmail.com Prince18
breninjf_jf@hotmail.com 6451iDy1
varrioth@hotmail.com 12Stumpy69
tatoassoline@hotmail.com 11Pedraum1
martinrafal@hotmail.com 10111994Martin
kuiperpieter@hotmail.com Talpa123
Xx_saturos_xX@hotmail.com Dmweb185
matrix_vi@hotmail.com G5vnse8i
求教大侠!!!!!!!!!!!!!!!!具体怎么写这个批处理
作者: taofan712 时间: 2017-3-8 00:24
挺具有综合性的,白天来试试
作者: Nsqs 时间: 2017-3-8 07:25
本帖最后由 Nsqs 于 2017-3-8 07:29 编辑
- ' 2>nul&cls&type "a.txt"|cscript -nologo -e:vbs "%~0">new.txt&exit
- set regexp=new regexp
- set ws=wsh.stdin
- with regexp
- do
- .global=-1
- read=ws.readline
- .pattern="\b\w{8,}$"
- if .test(read) then
- .pattern="\b(\d+|[a-zA-Z][a-zA-Z]+)$"
- if not .test(read) then
- .pattern="^.* (.*)$"
- r=.replace(read,"$1")
- .pattern="([A-Z].*|.*[A-Z].*)"
- if not .test(r) then
- .pattern="(^[a-z]+)(.*)"
- a=.replace(r,"$1")
- b=.replace(r,"$2")
- .pattern="\d*"
- s=.replace(a,empty)
- p=ucase(left(s,1))&right(s,len(s)-1)
- read=replace(read,r,replace(r,s,p))
- end if
- wsh.echo read
- end if
- end if
- loop until ws.atendofstream
- end with
复制代码
作者: codegay 时间: 2017-3-8 08:19
本帖最后由 codegay 于 2017-3-8 08:20 编辑
帮这种人有什么意义
快两年了同样的问题又问一次。
http://www.bathome.net/thread-36704-1-1.html
作者: 回家路上 时间: 2017-3-8 10:19
本帖最后由 回家路上 于 2017-3-8 10:34 编辑
- @set @n=0; /* & echo off & cscript -nologo -e:jscript "%~0"<1.txt>2.txt & pause & exit/b & rem */
-
- WScript.StdIn.ReadAll().replace(/(.*\s+)([^\s]{8,})\r\n/g, function($0,$1,$2){
- $2.replace(/((?:\d+([a-zA-Z])|([a-zA-Z])[\da-zA-Z]*\d)[\da-zA-Z]*)/, function(a,b,c,d){
- WSH.Echo($1+$2.replace(c?c:d, (c?c:d).toUpperCase()))
- })
- });
复制代码
作者: taofan712 时间: 2017-3-8 10:28
本帖最后由 taofan712 于 2017-3-8 13:22 编辑
“忽略有大写字母的,没有大写字母的将第一个英文转大写。” 这个任务好复杂啊
作者: 回家路上 时间: 2017-3-8 14:01
本帖最后由 回家路上 于 2017-3-8 18:10 编辑
纯批走一个- @echo off & setlocal enabledelayedexpansion
- :: 借前辈计算字符串长度方法http://www.bathome.net/thread-11799-1-1.html
- set "_length=set $=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d^!$^!^!$^!&set/a#len=0x^!$:~-60,2^!"
- set upls=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set "#%%i=%%i"
- for /f "tokens=1,*delims= " %%i in (1.txt) do (
- set "str=%%j"
- if "!str:~7!" neq "" (
- set "$=%%j"&(%_length%)&set /a len=!#len!-1
- for /l %%a in (0,1,!len!) do (
- if not defined end (
- set "letter=!str:~%%a,1!"
- set /a n=letter
- if !n!==!letter! (
- set /a "f|=1"
- if defined l (
- set s=!s!!letter!
- ) else set p=!p!!letter!
- ) else (
- set /a "f|=2"
- if not defined l (
- set l=!letter!
- ) else set s=!s!!letter!
- for %%i in (!letter!) do if "!upls!"=="!upls:%%i=%%i!" set "u=1"
- )
- if "!f!"=="3" (
- if defined u set end=1
- )
- )
- )
- if "!f!"=="3" (
- if not defined end for %%i in (!l!) do set str=!p!!#%%i!!s!
- ) else set "str="
- set p=&set l=&set s=&set f=&set u=&set "end="
- if defined str echo;%%i !str!
- )
- )
- pause & exit /b
复制代码
作者: taofan712 时间: 2017-3-8 14:38
- @echo off
- setlocal enabledelayedexpansion
- (for %%a in (a_A b_B c_C d_D e_E f_F g_G h_H i_I j_J k_K l_L m_M n_N o_O p_P q_Q r_R s_S t_T u_U v_V w_W x_X y_Y z_Z) do echo;%%a)>temp.txt
- for /f "tokens=1,2 delims= " %%a in (111.txt) do (
- setlocal
- set/a 1%%b1>nul 2>nul||set number=yes
- echo;%%b|findstr [0-9]>nul 2>nul&&set english=yes
- if defined number (
- set "number="
- if defined english (
- set "english=" &set "long="
- call :eightcheck %%b
- if defined long (
- set "capital="
- call :capscheck %%b
- if defined capital (
- echo;%%a %%b
- ) else (
- call :capschange %%b
- )
- )
- )
- )
- endlocal
- )>>222.txt
- echo;处理完毕&pause>nul&exit /b
-
- :eightcheck
- set "a=" & set str=%1
- :loop
- set /a a+=1
- set str=%str:~0,-1%
- if "%str%"=="" (
- if !a! geq 8 set long=yes
- ) else goto loop
- goto :eof
-
- :capscheck
- for /f "tokens=2 delims=_" %%c in (temp.txt) do (
- echo;%1|find "%%c">nul 2>nul&&set capital=yes
- )
- goto :eof
-
- :capschange
- set var=%1 & set head=%1
- for /l %%d in (0 1 9) do set head=!head:%%d=!
- set head=%head:~0,1%
-
- for /f "tokens=1,2 delims=_" %%i in ('findstr /i "%head%" temp.txt') do (
- set var=!var:%%i=%%j!
- echo;%%a !var!
- )
- goto :eof
复制代码
作者: WHY 时间: 2017-3-8 14:44
本帖最后由 WHY 于 2017-3-10 11:44 编辑
好吧,虽然卤猪逃跑了,但还是改一下- sed -r "/^\S+\s+([A-Za-z]+|[0-9]+|.{0,7})$/d;s/(^\S+\s+[0-9]*)([a-z])([a-z0-9]*)$/\1\u\2\3/" a.txt
复制代码
作者: WHY 时间: 2017-3-8 14:47
本帖最后由 WHY 于 2017-3-10 11:45 编辑
- $s = [IO.File]::ReadAllText('a.txt', [Text.Encoding]::Default);
- $s = [regex]::Replace($s, '(?m)^\S+\s+(\S{0,7}|[a-zA-Z]+|\d+)\r?$', '');
- $s = [regex]::Replace($s, '(?m)(?<=^\S+\s+\d*)[a-z](?=[a-z0-9]*\r?$)', { param($a); $a.Value.ToUpper() });
- $s | Out-File b.txt
复制代码
作者: WHY 时间: 2017-3-8 14:49
本帖最后由 WHY 于 2017-3-10 11:47 编辑
- @echo off & setlocal enabledelayedexpansion
-
- for %%i in (Q W E R T Y U I O P A S D F G H J K L Z X C V B N M) do set "_%%i=%%i"
-
- for /f "tokens=1,2" %%i in ('type a.txt ^| findstr /v "\<[a-Z][a-Z]*$ \<[0-9][0-9]*$"') do (
- set "s=%%j"
- for /f "delims=QWERTYUIOPASDFGHJKLZXCVBNM" %%k in ("#%%j#") do (
- if not "!s:~7!" == "" if "%%k" == "#%%j#" (
- for /f "tokens=*delims=1234567890" %%L in ("%%j") do (
- set "s1=!s:%%L=!"
- set "s2=%%L"
- )
- for %%L in ("!s2:~0,1!") do echo;%%i !s1!!_%%~L!!s2:~1!
- ) else echo;%%i %%j
- )
- )
- pause
复制代码
作者: taofan712 时间: 2017-3-8 14:53
回复 11# WHY
我也好想写这么高效的代码。
作者: 回家路上 时间: 2017-3-8 16:57
本帖最后由 回家路上 于 2017-3-8 18:18 编辑
回复 11# WHY
可以去掉一个for,把if not "!s:~7!" == ""提到外面。不过,你这种方式,不考虑“如果带有大写就不管他”的情况
刚好楼主的测试数据,自带的大写字母都是第一个字母,碰巧看不出来O(∩_∩)O!~~- @echo off & setlocal enabledelayedexpansion
- for %%i in (Q W E R T Y U I O P A S D F G H J K L Z X C V B N M) do set "_%%i=%%i"
- for /f "tokens=1,2" %%i in (a.txt) do (
- set "s=%%j"
- if not "!s:~7!" == "" (
- for /f "tokens=1delims=QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm" %%k in ("%%j") do (
- for /f "tokens=*delims=1234567890" %%a in ("%%j") do if "%%a" neq "" (
- set "l=%%a"
- for %%b in ("!l:~0,1!") do echo;%%i !s:%%a=!!_%%~b!!l:~1!
- )
- )
- )
- )
- pause & exit /b
复制代码
作者: taofan712 时间: 2017-3-8 17:29
回复 8# taofan712 - @echo off & setlocal enabledelayedexpansion
- for %%z in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set _%%z=%%z
- for /f "tokens=1,2 delims= " %%a in (111.txt) do (
- echo;%%b|findstr [a-Z]|findstr [0-9] >nul&&set mix=yes||set "mix="
- if defined mix (
- call :eightcheck %%b
- if defined long call :capschange %%a %%b
- )
- )
- echo;处理完毕 & pause>nul & exit /b
- :eightcheck
- set str=%1
- if not "%str:~7,1%"=="" (set long=yes ) else (set "long=" )
- goto :eof
- :capschange
- set var=%2 & set head=%2
- for /l %%d in (0 1 9) do set head=!head:%%d=!
- set head=%head:~0,1%
- call set capshead=%%_%head%%%
- call set var=%%var:%head%=%capshead%%%
- echo;%1 %var%
- )
- goto :eof
复制代码
改变了一些细节,精简了两个判断,效率相对有所提升(强制对字符串中出现的第一个字母进行大写转换)。
作者: WHY 时间: 2017-3-8 19:00
回复 13# 回家路上
嗯,谢谢你的提醒。
据说 for /f 中的 tokens=* 和 tokens=1 不一样。前者 for 的控制变量可以赋值为空,但后者不行,后者遇到空值时,for 不会处理。这算是可以把 for 等效于 if 判断的原因吧。
第二列包含字母;第二列包含数字;第二列长度大于7,这三个条件判断我认为是“条件与”的关系,所以谁先谁后应该没有关系吧
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |