Board logo

标题: [文本处理] 批处理如何在把带有换行符的字符串输入到文件? [打印本页]

作者: genekiller    时间: 2012-6-15 11:05     标题: 批处理如何在把带有换行符的字符串输入到文件?

本人在编一个批处理时遇到问题,情况是这样的:
我要在每一个for循环都向一个名为softdata的变量加入数据和换行符(即set softdata=!softdata!"换行符"%%a)
循环结束后,把softdata输出到名为a.txt的文件里,打开这个文件,字符串里的换行符全被等效成换行(
即softdata里的内容:a"换行符"b"换行符"c"换行符"d"换行符"e,输出到文件后为:
a
b
c
d
e)
请各位大大帮帮我这个出来乍到的新人吧!!!
作者: forfiles    时间: 2012-6-15 18:19

找一个数据里面不会出现的字符来表示换行,最后输出的时候把这个字符替换一下就行了。
作者: genekiller    时间: 2012-6-15 20:23

回复 2# forfiles

如果按上楼的做法,应该会用到for 循环多次执行echo XX>>a.txt,可是这个效率太低,我需要一次把softdata导入到文件里
作者: forfiles    时间: 2012-6-15 20:24

回复 3# genekiller


    不需要的。你贴代码出来吧,我帮你改。
作者: weichenxiehou    时间: 2012-6-15 22:17

回复 3# genekiller
既然知道用很多>>会降低效率,为什么不用一个?
  1. (for ... %%a in (...) do (
  2. ...
  3. echo,%%a
  4. ))>a.txt
复制代码

作者: genekiller    时间: 2012-6-16 10:57

本帖最后由 genekiller 于 2012-6-16 11:05 编辑

我的目的其实是想只用一次echo命令把一串含有换行符的字符串导入到文件,而文件中的换行符等效成了换行
代码就不拿了,代码比较大有300行左右而且代码之间联系很深不能单独拿出来,而且不在我现在用的电脑上
话说楼上那个代码其实也是用了多次echo命令。
作者: CrLf    时间: 2012-6-16 12:14

回复 6# genekiller


    如果通过 for /f 获取行内容,那么无解,因为 for /f 必然是以换行符为行分隔符的,可以改用 set /p 获取文本,因为它是以 crlf 或 lfcr 为分隔符的:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /l %%a in () do (
  3.    set /p str=
  4.    rem 此处爱做啥做啥
  5.    echo [!str!]
  6. ))<in.txt>out.txt
复制代码
或者用第三方 gawk:
  1. gawk "BEGIN{RS=\"\r\"}{这里做点什么;print $0}" in.txt>out.txt
复制代码

作者: genekiller    时间: 2012-6-16 13:46

斑竹的办法不错,不过小人想斗胆问一下,斑竹的第一种方法是否是一次性导入文件里的吗?试验显示这个方法如果不加入循环次数便会无限循环,我需要它能根据输入文件里的行数自动循环,而不是无限循环,如果用斑竹的这种办法,我该在循环体中加入什么判断条件来退出循环呢?
作者: powerbat    时间: 2012-6-16 13:48

是我没理解还是你们理解错了?楼主好像是这个意思?
  1. echo !softdata!>a.txt
复制代码
不要用%softdata%就行了,这种在预处理时会将换行符后面的内容截掉。
作者: CrLf    时间: 2012-6-16 17:02

回复 8# genekiller


    那就:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /l %%a in ('findstr /n .* in.txt') do (
  3.    set /p str=
  4.    rem 此处爱做啥做啥
  5.    echo [!str!]
  6. ))<in.txt>out.txt
  7. rem 使用 findstr 是为了兼容文件中的空行,若无空行可以将 ('findstr /n .* a.txt') 改为 (a.txt)
复制代码
详见:http://bbs.bathome.net/thread-13327-1-1.html
也有别的方式来指定循环次数,需酌情选择
作者: genekiller    时间: 2012-6-16 19:47

本帖最后由 genekiller 于 2012-6-16 19:49 编辑

现在想起我的那个批处理,斑竹这个有一点不符合我那批处理的要求,那就是in.txt里的内容和out.txt内容的区别只有换行,而我的那个批处理会按照某一变量的值和in.txt里的内容而改变更改输出到out.txt的内容,比如:
in.txt的内容为:
                     a,b,c
                     d,e,f
                     g,h,i
而根据实际情况有可能输出
out.txt为:      a,b,c
                     d,e,f
                     g,h,z
作者: 77七    时间: 2023-11-9 21:21

http://www.bathome.net/redirect.php?goto=findpost&;ptid=31373&pid=152207
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%l in (1,1,3) do (
  4.         set str=%%l;!str!
  5. )
  6. >1.txt (echo %str:;=&echo;%)
  7. pause
复制代码





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