[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

本帖最后由 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

回复 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

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

TOP

返回列表