Board logo

标题: [文本处理] 【已解决】批处理怎样实现每个文本里面的数据正负数分列? [打印本页]

作者: 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

  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in ('dir /b *.txt') do (
  3.     (for /f "usebackqdelims=" %%b in ("%%a") do (
  4.         set "s="
  5.         if %%b leq 9 (
  6.            for %%i in (%%b) do (
  7.                if %%i lss 0 (
  8.                   set s=!s! 0 %%i
  9.                ) else set s=!s! %%i 0
  10.            )
  11.         ) else for %%i in (%%b) do set s=!s! +%%i -%%i
  12.           echo;!s:~1!
  13.     ))>"%temp%\$"
  14.     move "%temp%\$" "%%a"
  15. )
  16. 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

没有处理 你提供的文本抬头 看则有点乱
  1. @echo off & setlocal enabledelayedexpansion
  2. md new_files 2>nul
  3. for /f "delims=" %%o in ('dir /b *.txt') do (
  4.     set "f="
  5.     (for /f "usebackqtokens=1-9" %%a in ("%%o") do (
  6.         set "s="
  7.         set "str=%%d %%e %%f %%a %%b %%c %%g %%h %%i"
  8.         if defined f (
  9.            for %%j in (!str!) do (
  10.                set n=%%j
  11.                if "!n:~,1!" == "-" (
  12.                   set s=!s! 0 %%j
  13.                ) else set s=!s! %%j 0
  14.            )
  15.         ) else set f=0&for %%j in (!str!) do set s=!s! +%%j -%%j
  16.           echo;!s:~1!
  17.     ))>"new_files\%%o"
  18. )
  19. 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
  1. @echo off & setlocal enabledelayedexpansion
  2. md new_files 2>nul
  3. for /f "delims=" %%o in ('dir /b *.txt') do (
  4.     (for /f "tokens=1-9" %%a in ('findstr /ic:"E+" "%%o"') do (
  5.         set "s="
  6.         set "str=%%d %%e %%f %%a %%b %%c %%g %%h %%i"
  7.            for %%j in (!str!) do (
  8.                set "n=%%j"
  9.                if "!n:~,1!" == "-" (
  10.                   set s=!s!    0    !n:-=!
  11.                ) else set s=!s!    !n!    0
  12.            )
  13.            echo;!s:~4!
  14.     ))>"new_files\%%o"
  15. )
  16. 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
是否可以一次性把要求说清楚,或者你上传一个完整文本,并说明要处理是最终结果
  1. @echo off & setlocal enabledelayedexpansion
  2. md new_files 2>nul
  3. for /f "delims=" %%o in ('dir /b *.txt') do (
  4.     (for /f "tokens=1-9" %%a in ('findstr /ic:"E+" /c:"E-" "%%o"') do (
  5.         set "s="
  6.         set "str=%%d %%e %%f %%a %%b %%c %%g %%h %%i"
  7.            for %%j in (!str!) do (
  8.                set "n=%%j"
  9.                if "!n:~,1!" == "-" (
  10.                   set s=!s!  0.00000000e+001  !n:~1!
  11.                ) else set s=!s!  !n!  0.00000000e+001
  12.            )
  13.            echo;!s:~2!
  14.     ))>"new_files\%%o"
  15. )
  16. 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