标题: [文本处理] 【已解决】批处理怎样实现每个文本里面的数据正负数分列? [打印本页]
作者: feng523 时间: 2015-6-23 09:44 标题: 【已解决】批处理怎样实现每个文本里面的数据正负数分列?
大家好,我遇到的问题是这样子:
一个文件夹有408个文本,每个文本中有9列数据,每列数据都有正负数;现在想处理为:
1.把每个文本中的9列数据共分为18列
2.正数放为一列,负数位置变为0,其中的负数在该列后面新增加一列存放负数,正数位置变为0
3.文本名称不变,408个文本另存为新的文件夹中,文件夹名称为 感谢大家
以一个文本,举例说明:
原有数据: (抬头名称) MX MY MZ FX FY FZ Ax Ay Az
1.2 -2 3 4 5 -6 -7 -8 -9.8
-2 10 -1 3 -4 5 6 5 10
3 10 -2 -4 -2 1 4 -2 3
目标数据: (抬头名称) +MX -MX +MY -MY +MZ -MZ +FX -FX +FY -FY +FZ -FZ +Ax -Ax +Ay -Ay +Az -Az
1.2 0 0 -2 3 0 4 0 5 0 0 -6 0 -7 0 -8 0 -9.8
0 -2 10 0 0 -1 3 0 0 -4 5 0 6 0 5 0 10 0
3 0 10 0 0 -2 0 -4 0 -2 1 0 4 0 0 -2 3 0
作者: terse 时间: 2015-6-23 12:28
- @echo off & setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b *.txt') do (
- (for /f "usebackqdelims=" %%b in ("%%a") do (
- set "s="
- if %%b leq 9 (
- for %%i in (%%b) do (
- if %%i lss 0 (
- set s=!s! 0 %%i
- ) else set s=!s! %%i 0
- )
- ) else for %%i in (%%b) do set s=!s! +%%i -%%i
- echo;!s:~1!
- ))>"%temp%\$"
- move "%temp%\$" "%%a"
- )
- pause
复制代码
作者: feng523 时间: 2015-6-23 13:33
灰常感谢@terse,我试验了下,这个命令文件可以用,很激动;但只能对常数有效,对科学技术法无效。我表达的有不严谨,能否给改善下,万分感激。
如果方便的话,能否在这个正负数分列处理之前,增加一个批处理:
1.第4列和第1列互换列的位置,第5列和第2列互换列的位置,第6列和第3列互换位置;
2.将互换好列位置的408个文本,按照正 负 列分成18列(正数放为一列,负数位置变为0,其中的负数在该列后面新增加一列存放负数,正数位置变为0)
作者: terse 时间: 2015-6-24 00:26
没有处理 你提供的文本抬头 看则有点乱- @echo off & setlocal enabledelayedexpansion
- md new_files 2>nul
- for /f "delims=" %%o in ('dir /b *.txt') do (
- set "f="
- (for /f "usebackqtokens=1-9" %%a in ("%%o") do (
- set "s="
- set "str=%%d %%e %%f %%a %%b %%c %%g %%h %%i"
- if defined f (
- for %%j in (!str!) do (
- set n=%%j
- if "!n:~,1!" == "-" (
- set s=!s! 0 %%j
- ) else set s=!s! %%j 0
- )
- ) else set f=0&for %%j in (!str!) do set s=!s! +%%j -%%j
- echo;!s:~1!
- ))>"new_files\%%o"
- )
- pause
复制代码
作者: feng523 时间: 2015-6-24 13:36
回复 4# terse
您好,感谢您的帮助。
能否删除附件中的抬头,(不处理抬头——在文本中直接把抬头删掉,)来实现列列对换,以及正负分开呢?您第一次的批处理,已经实现主要功能;第二次的批处理,没有运行成功;
能否在第一次批处理的命令进行完善下?有些改动,即新增加的负数列,取绝对值。大概流程如下:
1. 手动删除附件中的抬头名,只处理数据信息(文本中的信息都为科学技术型)
2. 第4列和第1列互换列的位置,第5列和第2列互换列的位置,第6列和第3列互换位置;
3. 把每个文本中的9列数据共分为18列
4. 每列正数放为一列,负数位置变为0;其中的负数在该列后面新增加一列存放负数,且取绝对值,正数位置变为0;(文本中的信息都为科学技术型)
5. 要求,每列的字符宽度一致,都为12个字符宽度,列与列之间有4个空格,看着整齐一些。
具体实现目的如下:
作者: terse 时间: 2015-6-24 23:42
回复 5# feng523 - @echo off & setlocal enabledelayedexpansion
- md new_files 2>nul
- for /f "delims=" %%o in ('dir /b *.txt') do (
- (for /f "tokens=1-9" %%a in ('findstr /ic:"E+" "%%o"') do (
- set "s="
- set "str=%%d %%e %%f %%a %%b %%c %%g %%h %%i"
- for %%j in (!str!) do (
- set "n=%%j"
- if "!n:~,1!" == "-" (
- set s=!s! 0 !n:-=!
- ) else set s=!s! !n! 0
- )
- echo;!s:~4!
- ))>"new_files\%%o"
- )
- pause
复制代码
作者: feng523 时间: 2015-6-25 12:41
回复 6# terse
首先,非常感谢您,这么晚还对提问的问题进行回复
其次,这个批处理程序已经实现了:列列对换,正负分开及取绝对值,每列之间由4个空格分开;由于对批处理不是太熟悉,没有注意到空格对批处理的影响;在此基础上能否烦请您再给修改一下,情况是这样子的:
1)由于要解决的408个文本当中,每列之间默认是两个空格,因为负值当中的“-”号需要占用一个空格,则每行中的每列之间要么为“1个空格和-”要么为“2个空格”;(如果该列都为-值,列与列之间为一个空格;如果该列既有正值,又有-值,则为两个空格或一个空格)。
由于这个原因,"delims="针对这些文本进行批处理,数据转换出现错误
2)批处理后,由于处理后的0不是科学计数型,占用一个字符(0),而其他正常数据则占用15个字符(比如2.90360175e+006);影响后期的数据处理,能否实现0也占用15个字符(比如0.00000000e+001)
下面附件即为原数据的一部分,具有典型性。
作者: terse 时间: 2015-6-25 17:49
本帖最后由 terse 于 2015-6-26 11:45 编辑
回复 7# feng523
是否可以一次性把要求说清楚,或者你上传一个完整文本,并说明要处理是最终结果- @echo off & setlocal enabledelayedexpansion
- md new_files 2>nul
- for /f "delims=" %%o in ('dir /b *.txt') do (
- (for /f "tokens=1-9" %%a in ('findstr /ic:"E+" /c:"E-" "%%o"') do (
- set "s="
- set "str=%%d %%e %%f %%a %%b %%c %%g %%h %%i"
- for %%j in (!str!) do (
- set "n=%%j"
- if "!n:~,1!" == "-" (
- set s=!s! 0.00000000e+001 !n:~1!
- ) else set s=!s! !n! 0.00000000e+001
- )
- echo;!s:~2!
- ))>"new_files\%%o"
- )
- pause
复制代码
作者: feng523 时间: 2015-6-25 22:27
回复 8# terse
不好意思,是小白级,有的地方给忽略了对批处理的影响。
以上面附件"数据.txt"进行处理,发现上面的命令对前面几列还可以,但是对后面几列科学计数法就表达错误了,处理后e前面的+-号有的没有给出。
作者: terse 时间: 2015-6-26 11:45
回复 9# feng523
8楼已修改 看看是不是你要的效果
作者: feng523 时间: 2015-6-26 12:19
回复 10# terse
该命令流处理之后,数据是我要的格式。非常感谢,解决了我的大难题,感激之情难以言表。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |