Board logo

标题: [文件操作] [已解决]批处理如何将TXT每行内容赋值给不同变量并显示? [打印本页]

作者: YJDP    时间: 2010-11-22 10:52     标题: [已解决]批处理如何将TXT每行内容赋值给不同变量并显示?

本帖最后由 YJDP 于 2012-6-18 16:37 编辑

闲话不多说,直接说问题
a.txt 中有5行(或更多)的字符
内容为:
a
b
c
d
e

我想用for将以上5行字条都分别赋值给5个不同的变量,但都是序列排列的
我想要的输出效果为:
st1=a
st2=b
st3=c
st4=d
st5=e

看了好多例子,试了一个通宵都没有办法实现。。。。
代码改了无数次,反正都没个对的,就随便贴其中一个版的吧。。。
  1. Setlocal enabledelayedexpression
  2. for /f "usebackq" %%i in (“a.txt”) do (
  3.     for %%j in (1,1,5) do set st%%j=%%i
  4.     echo st%%j
  5. )
  6. pause
复制代码
结果为 !st%%j!

其中运算时的变量赋值为
set st1=a
set st1=a
set st5=a

set st1=b
set st1=b
set st5=b

set st1=c
set st1=c
set st5=c

set st1=d
set st1=d
set st5=d
……

请高手给出正确代码并详细说明下原理。。。
这个问题弄了一晚上都没懂,不甘心啊。。。。

[ 本帖最后由 YJDP 于 2010-11-22 18:08 编辑 ]
作者: canyuexiaolang    时间: 2010-11-22 13:00

是,你没开启变量延迟啊。加上Setlocal enabledelayedexpression试试啊
作者: YJDP    时间: 2010-11-22 13:21

原帖由 canyuexiaolang 于 2010-11-22 13:00 发表
是,你没开启变量延迟啊。加上Setlocal enabledelayedexpression试试啊


这里忘贴上(已补上)
加了也不行= =!
我总是把同1行的字符不断的赋给每一个变量,郁闷死了。。
求解。。。。

[ 本帖最后由 YJDP 于 2010-11-22 13:52 编辑 ]
作者: wc726842270    时间: 2010-11-22 14:46

LZ是要这样的么?
  1. @echo off
  2. set n=0
  3. for /f %%i in (a.txt) do call :1 %%i
  4. pause
  5. :1
  6. set /a n+=1
  7. set st%n%=%1
  8. if defined st%n% (echo st%n%=%1) else echo 出现了错误
  9. goto :eof
复制代码

作者: manhua    时间: 2010-11-22 15:30     标题: 回复 1楼 的帖子

你要的输出效果是这个吧    你没有看变量延迟  所以得不到想要的结果
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%i in (a.txt) do (
  4. set /a n+=1
  5. echo st!n!=%%i
  6. )
复制代码

[ 本帖最后由 manhua 于 2010-11-22 15:33 编辑 ]
作者: YJDP    时间: 2010-11-22 15:51

原帖由 wc726842270 于 2010-11-22 14:46 发表
LZ是要这样的么?@echo off
set n=0
for /f %%i in (a.txt) do call :1 %%i
pause
:1
set /a n+=1
set st%n%=%1
if defined st%n% (echo st%n%=%1) else echo 出现了错误
goto :eof  


晕!这点代码就完美解决了!!
而且是无论多少行都行!太强大了!!
加上usebackq 更是好用!

非常感谢!!一定要好好研究下才行!!
作者: wc726842270    时间: 2010-11-22 16:29     标题: 回复 6楼 的帖子

本人很少用”USEBACKUP“所以不敢轻易使用,不过在这里我感觉没有必要啊,代码是次要的,思路才是重点(个人感觉)
作者: YJDP    时间: 2010-11-22 17:06

4楼的代码解决了变量的,不过在使用发现新问题

无法读出一行中空格后的内容,比如一行内容为  1(空格)2
取出来的结果是 1

在 for /f "usebackq" %%i in ("!updatefilename!") do call :readtxt %%i
使用了"usebackq" 没有效果
根据运行结果可以得出是在赋值时就将空格后面的字符给截了
set /a n+=1
set st%n%=%1
请问这是为什么呢,如何避免?
作者: wc726842270    时间: 2010-11-22 21:34     标题: 回复 8楼 的帖子

LZ解决不了么?很好办的啊!!
  1. @echo off
  2. set n=0
  3. for /f "delims=" %%i in (a.txt) do call :1 "%%i"
  4. pause
  5. :1
  6. set /a n+=1
  7. set b=%1
  8. set c=%b:"=%
  9. set st%n%=%c%
  10. if defined st%n% (echo st%n%=%c%) else echo 出现了错误
  11. goto :eof
复制代码

作者: lhsbqb    时间: 2010-11-26 10:32     标题: 回复 1楼 的帖子

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a num=0
  4. for /f "delims=" %%i in (a.txt) do (
  5. set /a num+=1
  6. set str!num!=%%i
  7. call echo str!num!=%%str!num!%%
  8. )
  9. pause
复制代码

作者: changzhi    时间: 2010-11-28 22:59

很不错呢,楼主这个可以做个好例子了

[ 本帖最后由 changzhi 于 2010-11-28 23:02 编辑 ]
作者: hanyeguxing    时间: 2010-11-28 23:49

因为不知道具体行数,所以不能直接for /l,而set/a的运算效率低,一般使用find或findstr来完成:
  1. for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do set st%%a=%%b
复制代码
如果要跳过空行,则:
  1. for /f "tokens=1* delims=:" %%a in ('findstr /n .* 1.txt') do if not "%%b"=="" set st%%a=%%b
复制代码
以上要求行首不能为分隔符




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