Board logo

标题: [文本处理] 批处理如何提取文本中第二列/第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 编辑
  1. ' 2>nul&cls&type "a.txt"|cscript -nologo -e:vbs "%~0">new.txt&exit
  2. set regexp=new regexp
  3. set ws=wsh.stdin
  4. with regexp
  5.     do
  6.     .global=-1
  7.     read=ws.readline
  8.         .pattern="\b\w{8,}$"
  9.         if .test(read) then
  10.             .pattern="\b(\d+|[a-zA-Z][a-zA-Z]+)$"
  11.             if not .test(read) then
  12.                 .pattern="^.* (.*)$"
  13.                 r=.replace(read,"$1")
  14.                 .pattern="([A-Z].*|.*[A-Z].*)"
  15.                 if not .test(r) then
  16.                     .pattern="(^[a-z]+)(.*)"
  17.                     a=.replace(r,"$1")
  18.                     b=.replace(r,"$2")
  19.                     .pattern="\d*"
  20.                     s=.replace(a,empty)
  21.                     p=ucase(left(s,1))&right(s,len(s)-1)
  22.                     read=replace(read,r,replace(r,s,p))
  23.                 end if
  24.                 wsh.echo read
  25.             end if
  26.         end if
  27.     loop until ws.atendofstream
  28. 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 编辑
  1. @set @n=0; /* & echo off & cscript -nologo -e:jscript "%~0"<1.txt>2.txt & pause & exit/b & rem */
  2. WScript.StdIn.ReadAll().replace(/(.*\s+)([^\s]{8,})\r\n/g, function($0,$1,$2){
  3. $2.replace(/((?:\d+([a-zA-Z])|([a-zA-Z])[\da-zA-Z]*\d)[\da-zA-Z]*)/, function(a,b,c,d){
  4. WSH.Echo($1+$2.replace(c?c:d, (c?c:d).toUpperCase()))
  5. })
  6. });
复制代码

作者: taofan712    时间: 2017-3-8 10:28

本帖最后由 taofan712 于 2017-3-8 13:22 编辑

“忽略有大写字母的,没有大写字母的将第一个英文转大写。” 这个任务好复杂啊
作者: 回家路上    时间: 2017-3-8 14:01

本帖最后由 回家路上 于 2017-3-8 18:10 编辑

纯批走一个
  1. @echo off & setlocal enabledelayedexpansion
  2. :: 借前辈计算字符串长度方法http://www.bathome.net/thread-11799-1-1.html
  3. set "_length=set $=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d^!$^!^!$^!&set/a#len=0x^!$:~-60,2^!"
  4. set upls=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  5. 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"
  6. for /f "tokens=1,*delims= " %%i in (1.txt) do (
  7. set "str=%%j"
  8. if "!str:~7!" neq "" (
  9. set "$=%%j"&(%_length%)&set /a len=!#len!-1
  10. for /l %%a in (0,1,!len!) do (
  11. if not defined end (
  12. set "letter=!str:~%%a,1!"
  13. set /a n=letter
  14. if !n!==!letter! (
  15. set /a "f|=1"
  16. if defined l (
  17. set s=!s!!letter!
  18. ) else set p=!p!!letter!
  19. ) else (
  20. set /a "f|=2"
  21. if not defined l (
  22. set l=!letter!
  23. ) else set s=!s!!letter!
  24. for %%i in (!letter!) do if "!upls!"=="!upls:%%i=%%i!" set "u=1"
  25. )
  26. if "!f!"=="3" (
  27. if defined u set end=1
  28. )
  29. )
  30. )
  31. if "!f!"=="3" (
  32. if not defined end for %%i in (!l!) do set str=!p!!#%%i!!s!
  33. ) else set "str="
  34. set p=&set l=&set s=&set f=&set u=&set "end="
  35. if defined str echo;%%i  !str!
  36. )
  37. )
  38. pause & exit /b
复制代码

作者: taofan712    时间: 2017-3-8 14:38

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. (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
  4. for /f "tokens=1,2 delims= " %%a in (111.txt) do (
  5.     setlocal
  6.     set/a 1%%b1>nul 2>nul||set number=yes
  7.     echo;%%b|findstr [0-9]>nul 2>nul&&set english=yes
  8.     if defined number (
  9.         set "number="
  10.         if defined english (
  11.             set "english=" &set "long="
  12.             call :eightcheck %%b
  13.             if defined long (
  14.                 set "capital="
  15.                 call :capscheck %%b
  16.                 if defined capital (
  17.                     echo;%%a    %%b
  18.                 ) else (
  19.    call :capschange %%b
  20.                 )           
  21.             )
  22.         )
  23.     )
  24. endlocal
  25. )>>222.txt
  26. echo;处理完毕&pause>nul&exit /b
  27. :eightcheck
  28. set "a=" & set str=%1
  29. :loop
  30. set /a a+=1
  31. set str=%str:~0,-1%
  32. if "%str%"=="" (
  33. if !a! geq 8 set long=yes
  34. ) else goto loop
  35. goto :eof
  36. :capscheck
  37. for /f "tokens=2 delims=_" %%c  in (temp.txt) do (
  38.     echo;%1|find "%%c">nul 2>nul&&set capital=yes
  39. )
  40. goto :eof
  41. :capschange
  42. set var=%1 & set head=%1
  43. for /l %%d in (0 1 9) do set head=!head:%%d=!
  44. set head=%head:~0,1%
  45. for /f "tokens=1,2 delims=_" %%i in ('findstr /i "%head%" temp.txt') do (
  46.     set var=!var:%%i=%%j!
  47.     echo;%%a    !var!
  48. )
  49. goto :eof
复制代码

作者: WHY    时间: 2017-3-8 14:44

本帖最后由 WHY 于 2017-3-10 11:44 编辑

好吧,虽然卤猪逃跑了,但还是改一下
  1. 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 编辑
  1. $s = [IO.File]::ReadAllText('a.txt', [Text.Encoding]::Default);
  2. $s = [regex]::Replace($s, '(?m)^\S+\s+(\S{0,7}|[a-zA-Z]+|\d+)\r?$', '');
  3. $s = [regex]::Replace($s, '(?m)(?<=^\S+\s+\d*)[a-z](?=[a-z0-9]*\r?$)', { param($a); $a.Value.ToUpper() });
  4. $s | Out-File b.txt
复制代码

作者: WHY    时间: 2017-3-8 14:49

本帖最后由 WHY 于 2017-3-10 11:47 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. 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"
  3. for /f "tokens=1,2" %%i in ('type a.txt ^| findstr /v "\<[a-Z][a-Z]*$ \<[0-9][0-9]*$"') do (
  4.     set "s=%%j"
  5.     for /f "delims=QWERTYUIOPASDFGHJKLZXCVBNM" %%k in ("#%%j#") do (
  6.         if not "!s:~7!" == "" if "%%k" == "#%%j#" (
  7.             for /f "tokens=*delims=1234567890" %%L in ("%%j") do (
  8.                 set "s1=!s:%%L=!"
  9.                 set "s2=%%L"
  10.             )
  11.             for %%L in ("!s2:~0,1!") do echo;%%i !s1!!_%%~L!!s2:~1!
  12.         ) else echo;%%i %%j
  13.     )
  14. )
  15. 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!~~
  1. @echo off & setlocal enabledelayedexpansion
  2. 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"
  3. for /f "tokens=1,2" %%i in (a.txt) do (
  4. set "s=%%j"
  5. if not "!s:~7!" == "" (
  6. for /f "tokens=1delims=QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm" %%k in ("%%j") do (
  7. for /f "tokens=*delims=1234567890" %%a in ("%%j") do if "%%a" neq "" (
  8. set "l=%%a"
  9. for %%b in ("!l:~0,1!") do echo;%%i !s:%%a=!!_%%~b!!l:~1!
  10. )
  11. )
  12. )
  13. )
  14. pause & exit /b
复制代码

作者: taofan712    时间: 2017-3-8 17:29

回复 8# taofan712
  1. @echo off & setlocal enabledelayedexpansion
  2. 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
  3. for /f "tokens=1,2 delims= " %%a in (111.txt) do (
  4.     echo;%%b|findstr [a-Z]|findstr [0-9] >nul&&set mix=yes||set "mix="
  5.     if defined mix (
  6.             call :eightcheck %%b
  7.             if defined long call :capschange %%a %%b
  8.     )
  9. )
  10. echo;处理完毕 & pause>nul & exit /b
  11. :eightcheck
  12. set str=%1
  13. if not "%str:~7,1%"=="" (set long=yes ) else (set "long=" )
  14. goto :eof
  15. :capschange
  16. set var=%2 & set head=%2
  17. for /l %%d in (0 1 9) do set head=!head:%%d=!
  18.     set head=%head:~0,1%
  19.     call set capshead=%%_%head%%%
  20.     call set var=%%var:%head%=%capshead%%%
  21.     echo;%1    %var%
  22. )
  23. goto :eof
复制代码
改变了一些细节,精简了两个判断,效率相对有所提升(强制对字符串中出现的第一个字母进行大写转换)。
作者: WHY    时间: 2017-3-8 19:00

回复 13# 回家路上


    嗯,谢谢你的提醒。

据说 for /f 中的 tokens=* 和 tokens=1 不一样。前者 for 的控制变量可以赋值为空,但后者不行,后者遇到空值时,for 不会处理。这算是可以把 for 等效于 if 判断的原因吧。

第二列包含字母;第二列包含数字;第二列长度大于7,这三个条件判断我认为是“条件与”的关系,所以谁先谁后应该没有关系吧




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2