[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 文本文件批处理取值空格怎么处理呢?

A文本内容:
192.168.0.2 0111.5777.132
192.168.0.4 0111.5515.333
192.168.0.5 0114.5555.334
192.168.0.6 0113.4555.335
192.168.0.7 0111.5555.336
192.168.0.8 0166.5557.338
192.168.0.9 0121.5555.393
192.168.0.13 0111.5555.300
192.168.0.17 0119.5555.311
192.168.0.19 0111.3555.333
192.168.0.20 0111.2555.321
192.168.0.22 0111.5512.133
192.168.0.23 0111.9555.333
192.168.0.25 0112.6525.377
192.168.0.26 0188.5500.988
192.168.0.27 0111.5789.311
192.168.0.29 0131.51b5.314
192.168.0.30 0011.55C5.333
192.168.0.32 0101.2531.333
192.168.0.33 0110.5511.332
192.168.0.34 0111.5444.354
192.168.0.35 0111.5543.333
192.168.0.36 0111.5555.157
192.168.0.40 0122.5555.401
192.168.0.41 0111.5588.123
B文本内容:
192.168.0.2    1111.1331.1111.2226        mac
192.168.0.4    1111.1111.1111.2228        windows
192.168.0.5                                            linux
192.168.0.6    7113.1661.1111.2224        linux
192.168.0.9    513.1361.1111.2222        windows
192.168.0.12                                            windows
192.168.0.23   9613.1651.1111.2321        mac
192.168.0.28                                           mac
192.168.0.37                                           lixux
192.168.0.40                                           lixux



C文本内容:
192.168.0.2    0111.5777.132     mac
192.168.0.4    0111.5515.333     windows
192.168.0.5    0114.5555.334     
192.168.0.6    0113.4555.335     linux
192.168.0.9    0121.5555.393     windows
192.168.0.12        
192.168.0.23    0111.9555.333     mac
192.168.0.28        
192.168.0.23    0111.9555.333     
192.168.0.40    0122.5555.401     

描述:
以B文本的第一列为基准,取值A文本的第二列,并把取B文本的第三列。
问题:
生成的C文本里的第三列有为空的,请问下怎么处理呢,把B文本的第三列全都列出来。


@echo off
setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=1,2" %%a in (A.txt) do set %%a=%%b
(for /f "tokens=1,3" %%a in (B.txt) do echo %%a    !%%a!    %%b)>C.txt
pause

本帖最后由 /zhqsystem/zhq 于 2018-8-25 00:51 编辑

for /f "tokens=1,2,3" %%i in ('type "c.txt"')do (
if /i "%%i"=="%%i%%j" (
  echo,%%i  空值  必空值
)else if /i "%%i"=="%%i%%k" (
  echo,%%i  %%j  空值
)else (
  echo,%%i %%j %%k
)
)
for /f "tokens=1,2,3" %%i in ('type "b.txt"')do (
if /i "%%~xj"=="" (
  echo,%%i %%j
)else (
  echo,%%i %%k
)
)
这么好的论坛你上哪找,运行测试环境为6.1.7601-64
注:请遵守互联网信息安全,勿用于非法用途

TOP

来一个
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "tokens=1,2" %%a in (A.txt) do set "%%a=%%b"
  4. (for /f "tokens=1-3" %%a in (B.txt) do (
  5.   if defined %%a (if "%%c"=="" (set "str=%%b") else set "str=%%c") else (if "%%c"=="" (set "str=                     %%b") else set "str=%%c")
  6.   echo %%a    !%%a!    !str!)
  7.   )>C.txt
  8. pause
复制代码
1

评分人数

    • yujw668: 谢谢您根据我的思路帮我解决问题。代码很好 ...技术 + 1

TOP

本帖最后由 yujw668 于 2018-8-27 17:45 编辑

回复 3# xczxczxcz


    另外,我想请问下输出的C文本的第二、三列不能对齐,该怎么解?有什么办法吗。

例如生成的文本C文本

192.168.0.9    1121.ccbc.1111             (1层)
192.168.0.58    2225.90c5.2222             (1层)linux
192.168.0.104    1111.05e2.4444             (1层)苹果
192.168.9.49                               (1层)空闲预留
192.168.0.221                               (1层)windows
192.168.9.87                               (1层)空闲预留
192.168.12.163                               (2层)空闲预留
192.168.12.168    1111.1111.1111             (2层)windows
192.168.12.246                               (2层)MAC
192.168.12.247                               (2层)预留
192.168.12.248                               (2层)预留
192.168.12.249                               (2层)预留
192.168.12.250                               (2层)预留

例如生产的C文本


192.168.0.238    111c.222.5a33             (4层)
192.168.0.240    2222.67f3.9d3f             (4层)
192.168.3.2    444b.3586.a444             (4层)
192.168.3.5                               (4层)
192.168.3.6    000e.c6dc.c345             (4层)
192.168.3.7    38c9.860a.e777             (4层)
192.168.3.8                               (4层)
192.168.3.13    7777.af34.8111             (4层)
192.168.3.193                               (4层)
192.168.3.194    7822.af34.8111             (4层)


代码
  1. @echo off
  2. for /f "delims=*" %%a in (C.txt) do call :xxx %%a
  3. pause&exit
  4. :xxx
  5.     set "str=%*"
  6.     set "str=%str: = %"
  7.     echo.%str%
  8. goto:eof
复制代码
当我使用这个代码排列时,不知道怎么都串行了。


这个代码我是看论坛版主写的,貌似没有考虑到有空的原因
  1. @echo off&setlocal enabledelayedexpansion
  2. set "kong=           "
  3. for /f "delims=" %%a in (1.txt) do (
  4.     for %%i in (%%a) do (
  5.         set "str=%%i"&set /a n+=1
  6.         if !n! equ 2 (
  7.            set "str=%kong%!str!"
  8.            set /p=!str:~-10! <nul
  9.            ) else (
  10.            set "str=!str!%kong%"
  11.            set /p=!str:~,20! <nul
  12.     ))
  13.     set "n=0"&echo.
  14. )
  15. pause>nul
复制代码

TOP

按制表符对齐方式
  1. @echo off & setlocal EnableDelayedExpansion
  2. for /f "tokens=1,2" %%a in (a.txt) do set "%%a=%%b"
  3. ( for /f "tokens=1-3" %%a in (b.txt) do (
  4.   if "%%c"=="" ( if defined %%a ( set "str=%%b") else set "str= %%b") else set "str=%%c"
  5.   rem 若把c.txt输入到EXCEL,则把第5行改为:if "%%c"=="" ( set "str=%%b") else set "str=%%c"
  6.   set "name=%%a !%%a! !str!"
  7.   set "name=!name: = !"
  8.   rem 右边的空位按一次TAB键输入,用鼠标选择时是一个完整的空位。若可以选择多个空格则输入错误,请设定编辑器。
  9.   echo;!name!
  10. ))>C.txt
  11. pause & exit
  12. rem 最后输出的文件是带制表符的,常见的有txt dat。它是按列对齐的。
复制代码
=================================

TOP

回复 4# yujw668

倒数第2个程式产生串行:是因为原C.TXT中第二列为空时有许多的空格,每个空格产生一个制表符,所以串行,显示不完换行显示。用此方式时只需一个空格即可。在 str=%str: =   % 这里可以添加多个制表符。但导入到EXCEL时会发现新增很多列,一个制表符一列。

TOP

建议以特殊字符(比如冒号或逗号等)作为列分隔符,不要使用制表符。否则肉眼看起来貌似对齐了,但是导入Excel不方面。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 5# xczxczxcz
  1. @echo off & setlocal EnableDelayedExpansion
  2. for /f "tokens=1,2" %%a in (A1.txt) do set "%%a=%%b"
  3. ( for /f "tokens=1-3" %%a in (B1.txt) do (
  4. if "%%c"=="" ( if defined %%a ( set "str=-----------%%b") else set "str=++++++++++++++++++++++++++++++++++++++++%%b") else set "str= ################%%c"
  5.   rem 若把c.txt输入到EXCEL,则把第5行改为:
  6.   ::if "%%c"=="" ( set "str=%%b") else set "str=%%c"
  7.   set "name=%%a !%%a! !str!"
  8.   set "name=!name: = !"
  9.   rem 右边的空位按一次TAB键输入,用鼠标选择时是一个完整的空位。若可以选择多个空格则输入错误,请设定编辑器。
  10.   echo;!name!
  11. ))>C1.txt
  12. pause & exit
  13. rem 最后输出的文件是带制表符的,常见的有txt dat。它是按列对齐的。
复制代码
您好!非常感谢您的耐心解答,我看了懂了一部分,也了解了是制表符产生的。我测试了这个代码,当我运用到生产环境中时,我发现,A文本没有B文本的相应的序列,那么着一种情况是对不齐的。

TOP

本帖最后由 yujw668 于 2018-8-29 10:26 编辑

回复 3# xczxczxcz

最一开始的那个代码我已经按照tab补齐了。

TOP

回复 7# Batcher

是的。谢谢指教

TOP

本帖最后由 yujw668 于 2018-9-30 12:38 编辑

A文本内容
  1. 192.168.0.2 0111.5777.132
  2. 192.168.0.4 0111.5515.333
  3. 192.168.0.5 0114.5555.334
  4. 192.168.0.6 0113.4555.335
  5. 192.168.0.7 0111.5555.336
  6. 192.168.0.8 0166.5557.338
  7. 192.168.0.9 0121.5555.393
  8. 192.168.0.13 0111.5555.300
  9. 192.168.0.17 0119.5555.311
  10. 192.168.0.19 0111.3555.333
  11. 192.168.0.20 0111.2555.321
  12. 192.168.0.22 0111.5512.133
  13. 192.168.0.23 0111.9555.333
  14. 192.168.0.25 0112.6525.377
  15. 192.168.0.26 0188.5500.988
  16. 192.168.0.27 0111.5789.311
  17. 192.168.0.29 0131.51b5.314
  18. 192.168.0.30 0011.55C5.333
  19. 192.168.0.32 0101.2531.333
  20. 192.168.0.33 0110.5511.332
  21. 192.168.0.34 0111.5444.354
  22. 192.168.0.35 0111.5543.333
  23. 192.168.0.36 0111.5555.157
  24. 192.168.0.40 0122.5555.401
  25. 192.168.0.41 0111.5588.123
复制代码
B文本内容
  1. 192.168.0.2 1111.1331.1111.2226 mac
  2. 192.168.0.4 1111.1111.1111.2228         windows
  3. 192.168.0.5 linux
  4. 192.168.0.6 7113.1661.1111.222 linux
  5. 192.168.0.9 513.1361.1111.2222 windows
  6. 192.168.0.12 windows
  7. 192.168.0.23 9613.1651.1111.2321         mac
  8. 192.168.0.28 mac
  9. 192.168.0.37 lixux
  10. 192.168.0.40 lixux
复制代码
C文本
  1. 192.168.0.2 0111.5777.132 2mac
  2. 192.168.0.4 0111.5515.333 2windows
  3. 192.168.0.5 0114.5555.334 1linux
  4. 192.168.0.6 0113.4555.335 2linux
  5. 192.168.0.9 0121.5555.393 2windows
  6. 192.168.0.12 3windows
  7. 192.168.0.23 0111.9555.333 2mac
  8. 192.168.0.28 3mac
  9. 192.168.0.37 3lixux
  10. 192.168.0.40 0122.5555.401 1lixux
复制代码
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "tokens=1,2" %%a in (A.txt) do set "%%a=%%b"
  4. (for /f "tokens=1-3" %%a in (B.txt) do (
  5.   if defined %%a (if "%%c"=="" (set "str=1%%b") else set "str=2%%c") else (if "%%c"=="" (set "str= 3%%b") else set "str=4%%c")
  6.   echo %%a !%%a! !str!)
  7.   )>C.txt
  8. pause
复制代码
我又重新编辑了一下文本,中间都是用TAB分割
想请问下,就是在取值的时候生成的C文本里丢弃带有空的行该怎么处理呢。也就是说192.168.0.12 192.168.0.28 192.168.0.40 对应的相应的行都丢弃。
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "tokens=1,2" %%A in (A.txt) do set "%%A=%%B"
  4. (for /f "tokens=1-3" %%A in (B.txt) do (
  5. if defined %%A echo %%A        !%%A!        %%C)
  6.   
  7.         
  8.   )>C.txt
  9. pause
复制代码
我这么定义,但是第三列又取不出来了。。。

TOP

本帖最后由 flashercs 于 2018-9-30 13:06 编辑

回复 11# yujw668
  1. @echo off
  2. setlocal ENABLEDELAYEDEXPANSION
  3. for /f "tokens=1,2" %%a in (A.txt) do set "%%a=%%b"
  4. (for /f "tokens=1-3 delims=  " %%a in (B.txt) do (
  5.   if defined %%a (if "%%c"=="" (set "str=1%%b") else set "str=2%%c") else (if "%%c"=="" (set "str= 3%%b") else set "str=4%%c")
  6.   echo %%a !%%a! !str!)
  7.   )>C.txt
  8. pause
复制代码
delims为TAB就可以了
还有C文本第二列缺失时后必须填充空格而不是TAB

TOP

回复 12# flashercs
谢谢您!
我的意思是说如果为空的这一行就不取相应的数值了。

TOP

返回列表