标题: [文本处理] 【已解决】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所有列间的分隔符只有一个,或为空格,或为制表符,同时空着的列为空格所替代:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do set /a n+=1&set "_!n!=%%a"
- for /l %%a in (1,1,%n%) do (
- (for /f "delims=" %%b in (z%%a.txt) do (
- set "str=%%b"
- for /l %%b in (0,2,40) do (
- set "a=!str:~%%b,1!"
- if "!a!" lss "0" set /a a=0
- set /a "a=(a+!_%%a:~%%b,1!) %% 10"
- set "var=!var! !a!"
- )
- echo,!var:~1!&set "var="
- ))>s%%a.txt
- )
复制代码
作者: 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- @echo off
- set n=0
- for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
- for /f "tokens=1* delims=:" %%a in ('findstr /n . a.txt') do (
- setlocal enabledelayedexpansion
- for %%i in (%%b) do set/a n+=1&set "$!n!=%%i"
- (for /f "delims=" %%i in (z%%a.txt) do (
- set Arr=&set str=%%i
- set m=0
- set "str=!str: =" "!"
- set "str=!str:%tab%=" "!"
- for %%j in ("!str!") do (
- set /a m+=1
- if %%j neq "" (
- for %%k in (!m!) do set/a "i=($%%k+%%~j+0)%%10"
- set Arr=!Arr!%tab%!i!
- ) else set Arr=!Arr!%tab%
- )
- echo;!Arr:~1!
- )
- endlocal
- )>s%%a.txt
- )
- 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 试试- Set fso = CreateObject("Scripting.FileSystemObject")
- Set file = fso.OpenTextFile("a.txt")
- Do Until file.AtEndofStream
- ar = Split(file.ReadLine,vbTab)
- ReDim Preserve a(20,i)
- For j = 0 to UBound(ar)
- a(j,i) = ar(j) '第i行 第j列
- Next
- i = i + 1
- Loop
-
- For i = 1 to 300
- Set file = fso.OpenTextFile("z" & i & ".txt")
- Do Until file.AtEndofStream
- ar = Split(file.ReadLine,vbTab)
- For j = 0 to UBound(ar)
- If ar(j) <> "" Then ar(j) = Right((CInt(ar(j)) + a(j,i-1)),1)
- Next
- fso.OpenTextFile("s" & i & ".txt",8,true).WriteLine Join(ar,vbTab)
- Loop
- file.Close : Set file = Nothing
- 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 |