Board logo

标题: [文本处理] [已解决]批处理如何修改文本中含指定字符/字符串的行的指定列的数值 [打印本页]

作者: 乱乱    时间: 2014-2-18 21:15     标题: [已解决]批处理如何修改文本中含指定字符/字符串的行的指定列的数值

6,2014.61804169416,,K34.dwg,面,,,,@
J1,1,2734285.296271,37576337.068334
J2,1,2734276.68625,37576333.260092
J3,1,2734274.202562,37576324.649762
J4,1,2734275.369237,37576311.397762
J5,1,2734282.76776,37576294.381226
J6,1,2734283.877532,37576288.462358
8,1285.13915223069,,K35、36.dwg,面,,,,@
J1,1,2734075.834331,37576167.169646
J2,1,2734073.519495,37576161.086733
J3,1,2734073.961343,37576154.017653
J4,1,2734076.612189,37576148.274042
J5,1,2734080.589156,37576143.855606
J6,1,2734090.509381,37576139.30705
J7,1,2734091.543267,37576139.803212
J8,1,2734094.293354,37576141.123049
4,2583.01236779988,,K35、36.dwg,面,,,,@
J1,1,2734162.766742,37576081.559505
J2,1,2734122.041759,37576087.880645
J3,1,2734115.441735,37576087.038083
J4,1,2734110.105597,37576084.650703

以上数据,我想把@那行中的第二个数量除以10000,
也就是小数点向前移动四位,文本都是以上相似的格式。
各位大侠请帮助下一,感激不尽!

作者: xxpinqz    时间: 2014-2-18 21:34

这个,自测下。
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (1.txt) do (
  3.     set "str=%%i"
  4.     if "!str:@=!"=="!str!" (
  5.     echo,%%i
  6.     ) else (
  7.         for /f "tokens=1-2* delims=,." %%a in ("%%i") do (
  8.             set "tmp=%%b"
  9.             echo,%%a,!tmp:~,-3!.!tmp:~-3!%%c
  10.         )
  11.     )
  12. ))>2.txt
复制代码

作者: 乱乱    时间: 2014-2-19 05:15

本帖最后由 乱乱 于 2014-2-19 05:28 编辑

回复 2# xxpinqz


不好意思,昨天帖子弄错了,应该是除以10000的,小数点前移4位后,
如果除数是小于10000的,还要在前面添加0补位。大于10000的就不用。
能不能再帮我改良下
作者: apang    时间: 2014-2-19 10:28

回复 3# 乱乱


    稍微改下:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (1.txt) do (
  3.     set "str=%%i"
  4.     if "!str:@=!"=="!str!" (
  5.         echo,%%i
  6.     ) else (
  7.         for /f "tokens=1-2* delims=,." %%a in ("%%i") do (
  8.             set "tmp=00000%%b"
  9.             for /f "tokens=*delims=0" %%d in ("!tmp:~,-4!") do (
  10.                 if "%%d" == "" (set z=0) else set "z=%%d"
  11.             )
  12.             echo,%%a,!z!.!tmp:~-4!%%c
  13.         )
  14.     )
  15. )
  16. pause
复制代码

作者: apang    时间: 2014-2-19 10:39

本帖最后由 apang 于 2014-2-19 16:20 编辑

不能简单地用除以10000的办法,请无视此楼!

再来一个
  1. @set @n=0;//&cscript -nologo -e:jscript "%~0">2.txt & exit/b
  2. fso = new ActiveXObject("Scripting.FileSystemObject");
  3. txt = fso.OpenTextFile("1.txt").ReadAll();
  4. txt = txt.replace(/(\d+)\.(\d+.+@)$/mg,
  5.       function(s,s1,s2) {return s1/10000 + s2}
  6. );
  7. WScript.StdOut.Write(txt)
复制代码

作者: 乱乱    时间: 2014-2-19 12:28

回复 4# apang


感谢,把多余的零也给消除了
如果是针对文件夹所有的txt文本,
进行一个批处理,还要添加什么呢?
作者: apang    时间: 2014-2-19 16:23

回复 6# 乱乱
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
  3.     (for /f "usebackq delims=" %%j in ("%%i") do (
  4.         set "str=%%j"
  5.         if "!str:@=!" neq "!str!" (
  6.             for /f "tokens=1-2* delims=,." %%a in ("!str!") do (
  7.                 set "tmp=00000%%b"
  8.                 for /f "tokens=*delims=0" %%d in ("!tmp:~,-4!") do (
  9.                     if "%%d" == "" (set z=0) else set "z=%%d"
  10.                 )
  11.                 echo,%%a,!z!.!tmp:~-4!%%c
  12.             )
  13.         ) else echo,!str!
  14.     ))>$
  15.     move $ "%%i"
  16. )
  17. pause
复制代码

作者: 乱乱    时间: 2014-2-19 18:35

回复 7# apang


    谢谢,我知道了,忘了批处理除法是整数的。
作者: xxpinqz    时间: 2014-2-20 12:40

可以了吧,如果要去除不足5位补上的0,(set z=0)改为(set z=)
作者: apang    时间: 2014-2-20 16:49

这样应该可以:
  1. @set @n=0;//&cscript -nologo -e:jscript "%~0" & pause & exit/b
  2. fso = new ActiveXObject("Scripting.FileSystemObject");
  3. txt = fso.OpenTextFile("1.txt").ReadAll();
  4. txt = txt.replace(/(\d+)\.(\d+.+@)/g,
  5.     function(s,s1,s2) {return new Number(s1/10000).toFixed(4)+s2}
  6. );
  7. WScript.Echo(txt)
复制代码

作者: 乱乱    时间: 2014-2-20 18:31

回复 9# xxpinqz


    可以了,谢谢。还好这是平方米转公顷的,要是平方米转亩的,就惨了...




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