Board logo

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

作者: 思想之翼    时间: 2013-10-27 05:13     标题: 【已解决】BAT如何让txt文本中每个数据加上特定数值后并取尾数?

若干文本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)
这样的代码如何写?恳望得到帮助。
作者: batman    时间: 2013-10-27 11:05

要想成功运行以下代码,请楼主确保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. )
复制代码

作者: batman    时间: 2013-10-27 11:07

如果楼主非要说列间的分隔符为不规则形式(数目不定,分隔符不定),那么,我只有恭喜你,此题无解!
作者: apang    时间: 2013-10-27 11:09

为何第2、3行小于21列?
列与列之间以什么做为分割符?空格还是tab?
作者: xxpinqz    时间: 2013-10-27 11:37

本帖最后由 xxpinqz 于 2013-10-27 16:12 编辑

理解错了,不是累计相加。。。。
作者: 思想之翼    时间: 2013-10-27 12:14

回复 4# apang
感谢关注!恳望得到大家的帮助。
也许1#表述不清,现已在1#上传附件。
txt文本格式见附件。
z1.txt文本空格(Tab)的地方,处理后s1.txt在同样的地方依然是空格(Tab)
作者: terse    时间: 2013-10-27 12:33

本帖最后由 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
复制代码

作者: 思想之翼    时间: 2013-10-27 12:37

本帖最后由 思想之翼 于 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

回复 5# xxpinqz
感谢关注!
1#已上附件。
您的代码测试时,显示找不到数据。
作者: apang    时间: 2013-10-27 14:51

本帖最后由 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
复制代码

作者: 思想之翼    时间: 2013-10-27 15:44

回复 10# apang
谢谢您,这么快就写出了代码。
经过测试,计算正确,速度快。
只是有一点小遗憾,那就是:在z*.txt没有数据的位置,s*.txt却填写了相加数值。能否可以使z*.txt没有数据的位置,在s*.txt中依然为空?
作者: apang    时间: 2013-10-27 16:01

回复 11# 思想之翼


    修改了,再试试看
作者: 思想之翼    时间: 2013-10-27 16:11

回复 7# terse
感谢您的帮助!
经过测试,您的代码处理数据出了一点偏差:需要的是z1.txt中21列数据,依次加上a.txt第一行对应21列的数据并取尾数。
比如0+0=0,取尾数依然是0;z1.txt中的空格位置,或略不计,在s1.txt依然为空。
恳望再次得到您的帮助。
作者: 思想之翼    时间: 2013-10-27 16:17

回复 10# apang

非常感谢,完美解决问题。
作者: terse    时间: 2013-10-27 16:54

回复 13# 思想之翼

代码的16行“set Arr=!Arr!%tab%!i:0=%tab%!” 改为  set Arr=!Arr!%tab%!i!
作者: 思想之翼    时间: 2013-10-27 17:40

回复 15# terse

谢谢您给予的帮助!




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