Board logo

标题: [文本处理] 文本文件批处理取值空格怎么处理呢? [打印本页]

作者: yujw668    时间: 2018-8-24 15:47     标题: 文本文件批处理取值空格怎么处理呢?

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:32

本帖最后由 /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
)
)
作者: xczxczxcz    时间: 2018-8-26 19:58

来一个
  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
复制代码

作者: yujw668    时间: 2018-8-27 16:07

本帖最后由 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
复制代码

作者: xczxczxcz    时间: 2018-8-28 14:11

按制表符对齐方式
  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。它是按列对齐的。
复制代码
=================================
作者: xczxczxcz    时间: 2018-8-28 14:29

回复 4# yujw668

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

建议以特殊字符(比如冒号或逗号等)作为列分隔符,不要使用制表符。否则肉眼看起来貌似对齐了,但是导入Excel不方面。
作者: yujw668    时间: 2018-8-28 18:27

回复 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文本的相应的序列,那么着一种情况是对不齐的。
作者: yujw668    时间: 2018-8-28 18:30

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

回复 3# xczxczxcz

最一开始的那个代码我已经按照tab补齐了。
作者: yujw668    时间: 2018-8-28 18:33

回复 7# Batcher

是的。谢谢指教
作者: yujw668    时间: 2018-9-30 12:35

本帖最后由 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
复制代码
我这么定义,但是第三列又取不出来了。。。
作者: flashercs    时间: 2018-9-30 12:57

本帖最后由 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
作者: yujw668    时间: 2018-9-30 14:08

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




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