找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 30025|回复: 14

[文本处理] 批处理如何提取文本中第二列/第2列符合指定条件的行内容

[复制链接]
发表于 2017-3-7 22:39:34 | 显示全部楼层 |阅读模式
本帖最后由 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


求教大侠!!!!!!!!!!!!!!!!具体怎么写这个批处理
发表于 2017-3-8 00:24:43 | 显示全部楼层
挺具有综合性的,白天来试试
发表于 2017-3-8 07:25:39 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2017-3-8 08:19:33 | 显示全部楼层
本帖最后由 codegay 于 2017-3-8 08:20 编辑

帮这种人有什么意义
快两年了同样的问题又问一次。
http://www.bathome.net/thread-36704-1-1.html

评分

参与人数 1技术 +1 收起 理由
回家路上 + 1 厉害,这都能被你发现~~

查看全部评分

发表于 2017-3-8 10:19:56 | 显示全部楼层
本帖最后由 回家路上 于 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. });
复制代码
发表于 2017-3-8 10:28:25 | 显示全部楼层
本帖最后由 taofan712 于 2017-3-8 13:22 编辑

“忽略有大写字母的,没有大写字母的将第一个英文转大写。” 这个任务好复杂啊
发表于 2017-3-8 14:01:51 | 显示全部楼层
本帖最后由 回家路上 于 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
复制代码

评分

参与人数 1技术 +1 收起 理由
taofan712 + 1 乐于助人

查看全部评分

发表于 2017-3-8 14:38:15 | 显示全部楼层

  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

复制代码
发表于 2017-3-8 14:44:04 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2017-3-8 14:47:19 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2017-3-8 14:49:11 | 显示全部楼层
本帖最后由 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
复制代码

评分

参与人数 1技术 +1 收起 理由
taofan712 + 1 乐于助人

查看全部评分

发表于 2017-3-8 14:53:35 | 显示全部楼层
回复 11# WHY

我也好想写这么高效的代码。
发表于 2017-3-8 16:57:05 | 显示全部楼层
本帖最后由 回家路上 于 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
复制代码
发表于 2017-3-8 17:29:12 | 显示全部楼层
回复 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
复制代码
改变了一些细节,精简了两个判断,效率相对有所提升(强制对字符串中出现的第一个字母进行大写转换)。
发表于 2017-3-8 19:00:30 | 显示全部楼层
回复 13# 回家路上


    嗯,谢谢你的提醒。

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

第二列包含字母;第二列包含数字;第二列长度大于7,这三个条件判断我认为是“条件与”的关系,所以谁先谁后应该没有关系吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-23 00:42

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表