标题: [文本处理] 文本文件批处理取值空格怎么处理呢? [打印本页]
作者: 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
来一个- @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 (
- if defined %%a (if "%%c"=="" (set "str=%%b") else set "str=%%c") else (if "%%c"=="" (set "str= %%b") else set "str=%%c")
- echo %%a !%%a! !str!)
- )>C.txt
- 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层)
代码- @echo off
- for /f "delims=*" %%a in (C.txt) do call :xxx %%a
- pause&exit
-
- :xxx
- set "str=%*"
- set "str=%str: = %"
- echo.%str%
- goto:eof
复制代码
当我使用这个代码排列时,不知道怎么都串行了。
这个代码我是看论坛版主写的,貌似没有考虑到有空的原因- @echo off&setlocal enabledelayedexpansion
- set "kong= "
- for /f "delims=" %%a in (1.txt) do (
- for %%i in (%%a) do (
- set "str=%%i"&set /a n+=1
- if !n! equ 2 (
- set "str=%kong%!str!"
- set /p=!str:~-10! <nul
- ) else (
- set "str=!str!%kong%"
- set /p=!str:~,20! <nul
- ))
- set "n=0"&echo.
- )
- pause>nul
复制代码
作者: xczxczxcz 时间: 2018-8-28 14:11
按制表符对齐方式- @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 (
- if "%%c"=="" ( if defined %%a ( set "str=%%b") else set "str= %%b") else set "str=%%c"
- rem 若把c.txt输入到EXCEL,则把第5行改为:if "%%c"=="" ( set "str=%%b") else set "str=%%c"
- set "name=%%a !%%a! !str!"
- set "name=!name: = !"
- rem 右边的空位按一次TAB键输入,用鼠标选择时是一个完整的空位。若可以选择多个空格则输入错误,请设定编辑器。
- echo;!name!
- ))>C.txt
- pause & exit
- 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 - @echo off & setlocal EnableDelayedExpansion
-
- for /f "tokens=1,2" %%a in (A1.txt) do set "%%a=%%b"
- ( for /f "tokens=1-3" %%a in (B1.txt) do (
- if "%%c"=="" ( if defined %%a ( set "str=-----------%%b") else set "str=++++++++++++++++++++++++++++++++++++++++%%b") else set "str= ################%%c"
- rem 若把c.txt输入到EXCEL,则把第5行改为:
- ::if "%%c"=="" ( set "str=%%b") else set "str=%%c"
- set "name=%%a !%%a! !str!"
- set "name=!name: = !"
- rem 右边的空位按一次TAB键输入,用鼠标选择时是一个完整的空位。若可以选择多个空格则输入错误,请设定编辑器。
- echo;!name!
- ))>C1.txt
- pause & exit
- 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文本内容- 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.222 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 2mac
- 192.168.0.4 0111.5515.333 2windows
- 192.168.0.5 0114.5555.334 1linux
- 192.168.0.6 0113.4555.335 2linux
- 192.168.0.9 0121.5555.393 2windows
- 192.168.0.12 3windows
- 192.168.0.23 0111.9555.333 2mac
- 192.168.0.28 3mac
- 192.168.0.37 3lixux
- 192.168.0.40 0122.5555.401 1lixux
复制代码
- @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 (
- 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")
- echo %%a !%%a! !str!)
- )>C.txt
- pause
复制代码
我又重新编辑了一下文本,中间都是用TAB分割
想请问下,就是在取值的时候生成的C文本里丢弃带有空的行该怎么处理呢。也就是说192.168.0.12 192.168.0.28 192.168.0.40 对应的相应的行都丢弃。- @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 (
-
- if defined %%A echo %%A !%%A! %%C)
-
-
- )>C.txt
- pause
复制代码
我这么定义,但是第三列又取不出来了。。。
作者: flashercs 时间: 2018-9-30 12:57
本帖最后由 flashercs 于 2018-9-30 13:06 编辑
回复 11# yujw668 - @echo off
- setlocal ENABLEDELAYEDEXPANSION
- for /f "tokens=1,2" %%a in (A.txt) do set "%%a=%%b"
- (for /f "tokens=1-3 delims= " %%a in (B.txt) do (
- 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")
- echo %%a !%%a! !str!)
- )>C.txt
- pause
复制代码
delims为TAB就可以了
还有C文本第二列缺失时后必须填充空格而不是TAB
作者: yujw668 时间: 2018-9-30 14:08
回复 12# flashercs
谢谢您!
我的意思是说如果为空的这一行就不取相应的数值了。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |