Board logo

标题: [文本处理] 批处理为何只能生成31个文件? [打印本页]

作者: danny123    时间: 2011-2-12 20:39     标题: 批处理为何只能生成31个文件?

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a n=0
  4. :loop
  5. set /a n+=1
  6. FOR /F "tokens=%n% delims=/" %%i in (gj.txt,58.txt) do @echo %%i >> cp%n%.txt
  7. goto :loop
复制代码
以上代码从gj.txt,58.txt 二个文本中各抽取一行内容组成新的文本,gj.txt,58.txt中的内容用“/”分隔

目前生成的cp**文件只能从cp1.txt到cp31.txt,只能生成31个文档,

gj.txt内容为
  1. qq情侣网名_/qq个性网名_/qq网名大全_/qq伤感网名_/qq网名繁体字_/2011qq网名_/腾讯qq网名_/腾讯网名_/qq非主流网名_/qq英文网名_/qq个性情侣网名_/qq非主流情侣网名_/qq情侣网名大全_/2011qq情侣网名_/qq英文情侣网名_/qq飞车情侣网名_/腾讯qq情侣网名_/qq空间情侣网名_/qq炫舞情侣网名_/qq伤感情侣网名_/2011qq个性网名_/qq非主流个性网名_/qq个性伤感网名_/qq女生个性网名_/qq个性英文网名_/腾讯qq个性网名_/qq性格网名_/qq男生个性网名_/qq个性网名繁体字_/2011qq网名大全_/qq网名繁体字大全_/qq网名大全男_/qq长网名大全_/qq英文网名大全_/腾讯qq网名大全_/qq男生网名大全_/qq女生网名大全_/2011qq情侣网名大全_/qq男生伤感网名_/qq非主流伤感网名_/2011qq伤感网名_/qq女生伤感网名_/伤感的qq网名_/qq伤感网名男_/qq网名伤感繁体字_/qq伤感长网名_/qq情侣网名繁体字_/qq网名繁体字转换器_/2011qq网名繁体字_/qq网名繁体字女生_/qq非主流网名繁体字_/qq男生网名繁体字_/qq可爱网名繁体字_/2011qq长网名_/2011腾讯网名_/2011qq女生网名_/2011qq超长网名_/腾讯qq英文网名_/腾讯qq2011网名_/腾讯qq可爱网名_/腾讯qq女网名_/腾讯qq搞笑网名_/qq网名_/qq非主流女生网名_/qq非主流男生网名_/2011qq非主流网名_/qq非主流英文网名_/qq非主流长网名_/非主流qq网名大全_/qq空间网名_/2011qq个性情侣网名_/qq个性情侣网名一对_/qq炫舞个性情侣网名_/qq个性情侣长网名_/qq个性情侣英文网名_/qq飞车个性情侣网名_/qq最新个性情侣网名_/qq个性伤感情侣网名_/qq个性情侣网名大全_/个性的qq情侣网名_/qq非主流情侣长网名_/非主流情侣网名_/非主流个性情侣网名_/2011非主流情侣网名_/非主流伤感情侣网名_/非主流情侣网名大全_/最新非主流情侣网名_/非主流情侣网名长的_/非主流超长情侣网名_/非主流幸福情侣网名_/qq飞车情侣网名大全_/qq情侣长网名大全_/qq英文情侣网名大全_/qq炫舞情侣网名大全_/qq空间情侣网名大全_/qq超长情侣网名大全_/qq12字情侣网名大全_/情侣网名大全_/2011qq超长情侣网名_/2011qq幸福情侣网名_/2011qq最新情侣网名_/2011qq情侣长网名_/
复制代码
58.txt内容为
  1. ︸°莫名的想妳︸°无意的念你|/▃_欲念▃_执念|/毒情畸情|/′为你饮剧毒′为你毁容颜|/情绪信念|/♦彼时彼刻的爱╮♦此时此刻的爱╮|/舍不得把你抓紧舍不得把你放开|/用你的时候ゝ千般温柔弃你的时候ゝ毫不留情|/我不要思念你我要紧挨着你|/一种相思゛两处闲愁゛|/两情若是久长时゛又岂在朝朝暮暮゛|/以身相许易以生相许难|/因为你是你因此我是我|/∞浮华霸黎つ∞尘世棟京つ|/゛成成尛京京的夫゛京京尛成成的妻|/╰硪是你的梁山伯╰硪是你的祝英台|/女人大声点男人快一点|/╰呐个男人的谎言╰呐个女人的谎言|/■硪爱你爱的无可救药□硪爱你爱的死心塌地|/╰最疼爱的人爱硪多少╰疼愛硪的人沒有多少|/失声╰呐喊触动每个音符闭眼╰聆听世界每个角度|/╰狠黄狠暴力╰狠纯狠暧昧|/Sou1相依ゞSou1相偎ゞ|/个性网的签名只是为了纪念你|/妳會莣記莪袔莪莋丕菿|/╭尛帥"╭爱帥帥"|/1加1等于2|/◇安分小男人"◇安分小女人"|/那誰我不在爱你那莪筭イ+厸|/最好的幸福是把一个人记住最累的辛苦是想你想到哭|/#我爱她.不容质疑.#我爱他.无须怀疑.|/何必强颜欢笑っ何必最做多情っ|/╰无可奈何花落去╰似曾相识燕归来m1n3珍惜你#m1n3珍重你#|/向往平淡√不甘平凡√|/谢谢你掌心温暖到我心原谅你看你一脸孩子气|/爱情好像流沙把我掩埋ひ爱情好像流沙把我掩埋ひ|/男人不坏女人不爱女人不爱男人不坏|/心没有安置ㄟ只好在流浪ㄟ|/我留在原点ㄲ始终很留恋ㄲ|/杂/老头杂/老太|/比起脑海离心脏更近的人比起相聚离分别更近的人|/╰﹀小黄牛╰﹀小狗狗|/我爱你.*e你爱我.*e|/永远葽快樂記得葽快樂|/悲痛″starˇ幸福″overˇ|/牽佐手っ吥離牽佑手っ吥棄|/左手边牵你右手边牵你|/溺水三千我只取一瓢饮|/派大星离不开海绵宝宝海綿寶寶離不開派大星|/许你一世柔情给你一生宠溺|/你这个优雅的废物※你这个冷漠的怪兽※|/始终如一相伴于你苦痛悲始终如一相随于你喜乐美|/曲终人散▍谁去谁留-繁华落尽▍谁痛谁伤-|/﹌花花世界-﹌何必当真-|/海绵宝宝为什么哭?因为派大星背叛了他|/一个如此霸道的男人い一个极端高傲的女人い|/青花瓷-兰亭序-|/曾经╮现在╮|/注定陪你到最后注定跟你到最后|/我是小人物你是大人物|/别拿山炮不当人er别拿二逼不吊事er|/涐爱你真真切切涐恋你刻骨铭心|/下雨了╮说抱歉天晴了╮说再见|/开心关心|/宠辱不惊坐看庭前花开花落╰我带你私奔╰带我去私奔|/愛愛愛愛愛╮貓花花花花花╮貓|/〆老男人〆老女人|/你是我内心的一首歌ゞ我是你内心的一首歌ゞ|/你腐蚀了我的全部你瓦解了我的所有|/喂等我嗯等你|/╰心疼你的心疼╰’疼爱你的疼爱|/丧心狂失心疯|/闻得到的气息触不到的温柔|/两情若是久长时#又岂在朝朝暮暮#|/纳爱斯▍清新有他°纳爱斯▍清新有她°|/◆◇:誰都吥媞誰の誰◇◆:呮侑莪媞莪の莪|/那過去の迴憶迴憶の那過去|/我离君天涯#君隔我海角#|/情人总分分和和我们却越爱越深|/
复制代码
谢谢大家

[ 本帖最后由 danny123 于 2011-2-12 21:57 编辑 ]
作者: broly    时间: 2011-2-12 21:00

for循环中tokens(列)的极限数是31
作者: danny123    时间: 2011-2-12 21:06

原帖由 broly 于 2011-2-12 21:00 发表
for循环中tokens(列)的极限数是31


请问有没有什么方法修改,不用tokens改用别的行不行?麻烦了
作者: broly    时间: 2011-2-12 21:21     标题: 回复 3楼 的帖子

这样吗?
  1. @echo off
  2. for %%a in (gj.txt 58.txt) do (
  3.   set n=0
  4.   for /f "tokens=1,* delims=/" %%i in (%%a) do call :sub %%i %%j
  5. )
  6. pause
  7. exit
  8. :sub
  9. set /a n+=1
  10. >>cp%n%.txt echo %1
  11. if not "%2"=="" (
  12.   for /f "tokens=1,* delims=/" %%i in ("%2") do (call :sub %%i %%j)
  13. )
复制代码

作者: danny123    时间: 2011-2-12 21:32

本帖最后由 pcl_test 于 2016-11-18 17:18 编辑

回复 4# broly
用您这个运行了一下,好像不行,没有文件生成,您再帮忙看看?
作者: cutebe    时间: 2011-2-12 21:34

  1. :换分隔符后用一般FOR来处理
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. FOR /F "delims=" %%i in (gj.txt,58.txt) do (
  5.  set "L=%%i"
  6.  set NL=!L:/=;!
  7.  FOR %%j in (!NL!) do (
  8.   set/a n+=1
  9.   >cp!n!.txt echo=%%j
  10.  )
  11. )
复制代码

作者: danny123    时间: 2011-2-12 21:38

本帖最后由 pcl_test 于 2016-11-18 17:18 编辑

回复 6# cutebe
运行了一下,您这个gj.txt和58.txt里面的内容没有串在一起,是分开的,能帮忙看看吗

[ 本帖最后由 danny123 于 2011-2-12 22:06 编辑 ]
作者: broly    时间: 2011-2-12 21:41     标题: 回复 7楼 的帖子

测试没有问题。
你的文本命名之类的有没有弄错?
作者: danny123    时间: 2011-2-12 22:03

好像是58.txt里面的各种符号造成的,全中文就没问题
作者: CrLf    时间: 2011-2-12 22:08     标题: 回复 8楼 的帖子

  1. @echo off&setlocal enabledelayedexpansion
  2. for %%f in (gj.txt 58.txt) do (
  3.    set n=
  4.    for /f "delims=" %%a in (%%f) do (
  5.      set tmp=%%a&set tmp=!tmp:/=" "!
  6.      for %%i in ("!tmp!") do set /a "n+=1"&set .%%f!n!=%%~i
  7.    )
  8. )
  9. for /l %%a in (1 1 %n%) do (
  10.    echo !.gj.txt%%a!
  11.    echo !.58.txt%%a!
  12. )>>%%a.txt
  13. pause
  14. exit
复制代码

[ 本帖最后由 zm900612 于 2011-2-12 22:15 编辑 ]
作者: danny123    时间: 2011-2-12 22:17

原帖由 zm900612 于 2011-2-12 22:08 发表
@echo off&setlocal enabledelayedexpansion
for %%f in (gj.txt 58.txt) do (
   set n=
   for /f "delims=" %%a in (%%f) do (
     set tmp=%%a&set tmp=!tmp:/=" "!
     for %%i in ("!tmp!") do set /a  ...


谢谢,您的代码运行后文字左右多了分号",生成没有问题,我真实的文档里面是6000多条,就无法生成了,谢谢这位大哥
作者: broly    时间: 2011-2-12 22:45

修改了一下6楼的代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (gj.txt 58.txt) do (
  4. set n=0
  5. FOR /F "delims=" %%i in (%%a) do (
  6.  set "L=%%i"
  7.  set NL=!L:/=;!
  8.  FOR %%j in (!NL!) do (
  9.   set/a n+=1
  10.   >>cp!n!.txt echo=%%j
  11.  )
  12. )
  13. )
复制代码

作者: cutebe    时间: 2011-2-12 23:21

  1. :不处理一些特殊字符
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. FOR /F "delims=" %%i in (gj.txt,58.txt) do (
  5.  set "L=%%i"
  6.  set NL=!L:/=;!
  7.  set n=
  8.  FOR %%j in (!NL!) do (
  9.   set/a n+=1
  10.   >>cp!n!.txt echo=%%j
  11.  )
  12. )
  13. pause
复制代码

作者: CrLf    时间: 2011-2-12 23:50

10楼代码已修正...
作者: danny123    时间: 2011-2-13 16:17     标题: 请求帮忙修改一下代码,还是tokens显示31条的问题

昨天在论坛求助,大家都踊跃帮忙,十分感谢,具体见

批处理为何只能生成31个文件?

但存在一个问题,因为我的文档内容太多,每个都在100K左右,运行昨天各位提供的代码就无法生成文件了,现在这里有一个代码,每生成完一个文件后需要按任意键才可以继续生成,但仍然有 tokens 31 次的限制,请求大家再帮我参考一下,
  1. @echo off
  2. set /a n=0
  3. :loop
  4. set /a n+=1
  5. FOR /F "tokens=%n% delims=/" %%i in (gj.txt,58.txt) do @echo %%i >> cp%n%.txt
  6. pause
  7. goto :loop
复制代码
因为附件有100多K,所以传在网盘,请大家有空帮忙看看

gj.txt  地址  http://u.115.com/file/f752225630
58.txt  地址  http://u.115.com/file/f7fe67bbf6

谢谢
作者: CrLf    时间: 2011-2-13 16:45

100KB=102400B
如果都在同一行的话,这个是不是太大了...变量的极限容量才8192,所以我弃权...
作者: danny123    时间: 2011-2-13 17:00

有没有方法改成不受限制,批处理一点都不懂,不好意思诸位
作者: CrLf    时间: 2011-2-13 17:16

不知道for /f "tokens=1*"...语句的参数有没有限制极限长度,如果没限制的话估计用临时文件可以做到,不过效率就不用指望了
还有一个思路是fsutil+for切割文件,但是无论效率还是通用性上都差强人意
不用第三方命令的话,别的思路暂时没有了...等待高人出现

[ 本帖最后由 zm900612 于 2011-2-13 17:17 编辑 ]
作者: hanyeguxing    时间: 2011-2-13 17:31

使用fr或sed替换/为换行
然后用for 处理
作者: cutebe    时间: 2011-2-13 19:05

是阿,使用用第三方SED 4.14吧(注意备份你的两个TXT文本)
http://bbs.bathome.net/thread-1114-1-1.html
  1. @echo off
  2. cd/d %~dp0
  3. (echo sed -i "s/\//\n/g" gj.txt
  4. echo sed -i "s/\//\n/g" 58.txt
  5. echo exit)>N.BAT
  6. start N.BAT
  7. echo 按任意键开始生成文件
  8. pause>nul
  9. setlocal enabledelayedexpansion
  10. for %%a in (gj.txt;58.txt)do (
  11.  set n=
  12.  FOR /F "delims=" %%i in (%%a) do (
  13.   set/a n+=1
  14.   >>cp!n!.txt echo=%%i
  15.  )
  16. )
  17. del N.BAT
  18. pause
复制代码

[ 本帖最后由 cutebe 于 2011-2-13 19:06 编辑 ]
作者: Batcher    时间: 2011-2-13 19:18     标题: 回复 15楼 的帖子

过期了,无法从网盘下载。
作者: CUer    时间: 2011-2-13 19:29

  1. gawk -F/ "NR==FNR{for(i=1;i<=NF;i++)a[i]=$i}NR>FNR{for(i=1;i<=NF;i++)print $i\"\n\"a[i] >\"cp\"i\".txt\"}" 58.txt gj.txt
复制代码

作者: danny123    时间: 2011-2-13 23:42

原帖由 Batcher 于 2011-2-13 19:18 发表
过期了,无法从网盘下载。


谢谢,已经续了
作者: danny123    时间: 2011-2-13 23:44

原帖由 cutebe 于 2011-2-13 19:05 发表
是阿,使用用第三方SED 4.14吧(注意备份你的两个TXT文本)
http://bbs.bathome.net/thread-1114-1-1.html@echo off
cd/d %~dp0
(echo sed -i "s/\//\n/g" gj.txt
echo sed -i "s/\//\n/g" 58.txt
echo exit)>N ...


测试了一下,好像不行,谢谢您
作者: broly    时间: 2011-2-13 23:49

原帖由 danny123 于 2011-2-13 23:42 发表


谢谢,已经续了


还是过期。。。
用VBS可以不。。。
作者: broly    时间: 2011-2-14 00:14

原帖由 broly 于 2011-2-13 23:49 发表


还是过期。。。
用VBS可以不。。。

  1. '//保存此文件为 untitled.vbs
  2. '//跟那两个文本放在一起,然后运行。。。
  3. Dim fso,f,ary1,ary2,intMax,intMin,i,strText
  4. Set fso=CreateObject("Scripting.FileSystemObject")
  5. Set f=fso.OpenTextFile(fso.GetFolder(".") & "\gj.txt",1)
  6. ary1=Split(f.ReadAll,"/",-1) : f.Close
  7. Set f=fso.OpenTextFile(fso.GetFolder(".") & "\58.txt",1)
  8. ary2=Split(f.ReadAll,"/",-1) : f.Close
  9. If UBound(ary1) > UBound(ary2) Then
  10.   intMax=UBound(ary1)
  11.   intMin=UBound(ary2)
  12. Else
  13.   intMax=UBound(ary2)
  14.   intMin=UBound(ary1)
  15. End If
  16. For i=1 To intMin
  17.   strText=ary1(i) & vbCrLf & ary2(i)
  18.   Set f=fso.CreateTextFile("cp"&i&".txt",True)
  19.   f.Write strText
  20.   f.Close
  21. Next
  22. For i=intMin To intMax
  23.   If UBound(ary1)=intMax Then
  24.     strText=ary1(i)
  25.   Else
  26.     strText=ary2(i)
  27.   End If
  28.   Set f=fso.CreateTextFile("cp"&i&".txt",True)
  29.   f.Write strText
  30.   f.Close
  31. Next
  32. MsgBox "完成!"
  33. Set fso=Nothing:Set f=Nothing
复制代码





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