找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 70976|回复: 15

[文本处理] 【已解决】BAT如何让txt文本中每个数据加上特定数值后并取尾数?

[复制链接]
发表于 2013-10-27 05:13:09 | 显示全部楼层 |阅读模式
若干文本z1.txt  z2.txt  z3.txt  z4.txt...z300.txt,数值0-9,行数不规则,共21列,格式为
2        1        2        4        4    ...    9
          5        2        4
                              4
...

另一文本a.txt中有21列数值为0-9的数据,行数300行,与z1.txt  z2.txt  z3.txt  z4.txt...z300.txt的文本个数一一对应,格式为
1   2...3   4
5   6...6   9
7   8...7   1
9   0...6   3
...

欲:
z1.txt中第1列数据加上a.txt第一行的第1列数据,z1.txt第2列数据加上a.txt第一行的第2列数据,...z1.txt第21列数据加上a.txt第一行的第21列数据,并取其和值的尾数(个位数),另存为s1.txt
z2.txt中第1列数据加上a.txt第二行的第1列数据,z2.txt第2列数据加上a.txt第二行的第2列数据,...z2.txt第21列数据加上a.txt第二行的第21列数据,并取其和值的尾数(个位数),另存为s2.txt
z3.txt中第1列数据加上a.txt第三行的第1列数据,z3.txt第2列数据加上a.txt第三行的第2列数据,...z3.txt第21列数据加上a.txt第三行的第21列数据,并取其和值的尾数(个位数),另存为s3.txt
...

z1.txt  z2.txt...文本空格(tab)处,数据处理后依然为空格(tab)
这样的代码如何写?恳望得到帮助。

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2013-10-27 11:05:01 | 显示全部楼层
要想成功运行以下代码,请楼主确保a.txt和z*.txt所有列间的分隔符只有一个,或为空格,或为制表符,同时空着的列为空格所替代:

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (a.txt) do set /a n+=1&set "_!n!=%%a"
  3. for /l %%a in (1,1,%n%) do (
  4.   (for /f "delims=" %%b in (z%%a.txt) do (
  5.     set "str=%%b"
  6.     for /l %%b in (0,2,40) do (
  7.       set "a=!str:~%%b,1!"
  8.       if "!a!" lss "0" set /a a=0
  9.       set /a "a=(a+!_%%a:~%%b,1!) %% 10"
  10.       set "var=!var! !a!"
  11.     )
  12.     echo,!var:~1!&set "var="
  13.   ))>s%%a.txt
  14. )
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 谢谢

查看全部评分

发表于 2013-10-27 11:07:34 | 显示全部楼层
如果楼主非要说列间的分隔符为不规则形式(数目不定,分隔符不定),那么,我只有恭喜你,此题无解!
发表于 2013-10-27 11:09:24 | 显示全部楼层
为何第2、3行小于21列?
列与列之间以什么做为分割符?空格还是tab?
发表于 2013-10-27 11:37:46 | 显示全部楼层
本帖最后由 xxpinqz 于 2013-10-27 16:12 编辑

理解错了,不是累计相加。。。。
 楼主| 发表于 2013-10-27 12:14:29 | 显示全部楼层
回复 4# apang
感谢关注!恳望得到大家的帮助。
也许1#表述不清,现已在1#上传附件。
txt文本格式见附件。
z1.txt文本空格(Tab)的地方,处理后s1.txt在同样的地方依然是空格(Tab)
发表于 2013-10-27 12:33:35 | 显示全部楼层
本帖最后由 terse 于 2013-10-27 16:55 编辑

相加结果为0的话 替换为跳格键
还是改为 相加结果为0 显示0

  1. @echo off
  2. set n=0
  3. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
  4. for /f "tokens=1* delims=:" %%a in ('findstr /n . a.txt') do (
  5.     setlocal enabledelayedexpansion
  6.     for %%i in (%%b) do set/a n+=1&set "$!n!=%%i"
  7.         (for /f "delims=" %%i in (z%%a.txt) do (
  8.              set Arr=&set str=%%i
  9.              set m=0
  10.              set "str=!str: =" "!"
  11.              set "str=!str:%tab%=" "!"
  12.              for %%j in ("!str!") do (
  13.                  set /a m+=1
  14.                  if %%j neq "" (
  15.                     for %%k in (!m!) do set/a "i=($%%k+%%~j+0)%%10"
  16.                     set Arr=!Arr!%tab%!i!
  17.                  ) else set Arr=!Arr!%tab%
  18.              )
  19.              echo;!Arr:~1!
  20.          )
  21.          endlocal
  22.     )>s%%a.txt
  23. )
  24. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 谢谢您

查看全部评分

 楼主| 发表于 2013-10-27 12:37:33 | 显示全部楼层
本帖最后由 思想之翼 于 2013-10-27 12:41 编辑

回复 2# batman
感谢您的帮助!
您的代码经测试,有误。可能是我在1#没有说明白,也未上附件的缘故。现已在1#上附件。
1、有些数值计算错了
2、z*.txt文本空格(tab)处,数据处理后为0,s*.txt需要依然是空格(tab)
3、z*.txt文本空格(tab)形式,s*.txt依然保持tab空格形式
 楼主| 发表于 2013-10-27 12:47:20 | 显示全部楼层
回复 5# xxpinqz
感谢关注!
1#已上附件。
您的代码测试时,显示找不到数据。
发表于 2013-10-27 14:51:52 | 显示全部楼层
本帖最后由 apang 于 2013-10-27 16:00 编辑

保存为test.vbs 试试
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. Set file = fso.OpenTextFile("a.txt")
  3. Do Until file.AtEndofStream
  4.     ar = Split(file.ReadLine,vbTab)
  5.     ReDim Preserve a(20,i)
  6.     For j = 0 to UBound(ar)
  7.         a(j,i) = ar(j)  '第i行 第j列
  8.     Next
  9.     i = i + 1
  10. Loop

  11. For i = 1 to 300
  12.     Set file = fso.OpenTextFile("z" & i & ".txt")
  13.     Do Until file.AtEndofStream
  14.         ar = Split(file.ReadLine,vbTab)
  15.         For j = 0 to UBound(ar)
  16.             If ar(j) <> "" Then ar(j) = Right((CInt(ar(j)) + a(j,i-1)),1)
  17.         Next
  18.         fso.OpenTextFile("s" & i & ".txt",8,true).WriteLine Join(ar,vbTab)
  19.     Loop
  20.     file.Close : Set file = Nothing
  21. Next
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 优秀作品

查看全部评分

 楼主| 发表于 2013-10-27 15:44:23 | 显示全部楼层
回复 10# apang
谢谢您,这么快就写出了代码。
经过测试,计算正确,速度快。
只是有一点小遗憾,那就是:在z*.txt没有数据的位置,s*.txt却填写了相加数值。能否可以使z*.txt没有数据的位置,在s*.txt中依然为空?
发表于 2013-10-27 16:01:43 | 显示全部楼层
回复 11# 思想之翼


    修改了,再试试看
 楼主| 发表于 2013-10-27 16:11:45 | 显示全部楼层
回复 7# terse
感谢您的帮助!
经过测试,您的代码处理数据出了一点偏差:需要的是z1.txt中21列数据,依次加上a.txt第一行对应21列的数据并取尾数。
比如0+0=0,取尾数依然是0;z1.txt中的空格位置,或略不计,在s1.txt依然为空。
恳望再次得到您的帮助。
 楼主| 发表于 2013-10-27 16:17:02 | 显示全部楼层
回复 10# apang

非常感谢,完美解决问题。
发表于 2013-10-27 16:54:16 | 显示全部楼层
回复 13# 思想之翼

代码的16行“set Arr=!Arr!%tab%!i:0=%tab%!” 改为  set Arr=!Arr!%tab%!i!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 22:58 , Processed in 0.023168 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表