标题: [文本处理] [已解决]批处理如何修改文本中含指定字符/字符串的行的指定列的数值 [打印本页]
作者: 乱乱 时间: 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
这个,自测下。- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (1.txt) do (
- set "str=%%i"
- if "!str:@=!"=="!str!" (
- echo,%%i
- ) else (
- for /f "tokens=1-2* delims=,." %%a in ("%%i") do (
- set "tmp=%%b"
- echo,%%a,!tmp:~,-3!.!tmp:~-3!%%c
- )
- )
- ))>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# 乱乱
稍微改下:- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (1.txt) do (
- set "str=%%i"
- if "!str:@=!"=="!str!" (
- echo,%%i
- ) else (
- for /f "tokens=1-2* delims=,." %%a in ("%%i") do (
- set "tmp=00000%%b"
- for /f "tokens=*delims=0" %%d in ("!tmp:~,-4!") do (
- if "%%d" == "" (set z=0) else set "z=%%d"
- )
- echo,%%a,!z!.!tmp:~-4!%%c
- )
- )
- )
- pause
复制代码
作者: apang 时间: 2014-2-19 10:39
本帖最后由 apang 于 2014-2-19 16:20 编辑
不能简单地用除以10000的办法,请无视此楼!
再来一个- @set @n=0;//&cscript -nologo -e:jscript "%~0">2.txt & exit/b
- fso = new ActiveXObject("Scripting.FileSystemObject");
- txt = fso.OpenTextFile("1.txt").ReadAll();
- txt = txt.replace(/(\d+)\.(\d+.+@)$/mg,
- function(s,s1,s2) {return s1/10000 + s2}
- );
- WScript.StdOut.Write(txt)
复制代码
作者: 乱乱 时间: 2014-2-19 12:28
回复 4# apang
感谢,把多余的零也给消除了
如果是针对文件夹所有的txt文本,
进行一个批处理,还要添加什么呢?
作者: apang 时间: 2014-2-19 16:23
回复 6# 乱乱 - @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /a-d /b *.txt') do (
- (for /f "usebackq delims=" %%j in ("%%i") do (
- set "str=%%j"
- if "!str:@=!" neq "!str!" (
- for /f "tokens=1-2* delims=,." %%a in ("!str!") do (
- set "tmp=00000%%b"
- for /f "tokens=*delims=0" %%d in ("!tmp:~,-4!") do (
- if "%%d" == "" (set z=0) else set "z=%%d"
- )
- echo,%%a,!z!.!tmp:~-4!%%c
- )
- ) else echo,!str!
- ))>$
- move $ "%%i"
- )
- 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
这样应该可以:- @set @n=0;//&cscript -nologo -e:jscript "%~0" & pause & exit/b
- fso = new ActiveXObject("Scripting.FileSystemObject");
- txt = fso.OpenTextFile("1.txt").ReadAll();
- txt = txt.replace(/(\d+)\.(\d+.+@)/g,
- function(s,s1,s2) {return new Number(s1/10000).toFixed(4)+s2}
- );
- WScript.Echo(txt)
复制代码
作者: 乱乱 时间: 2014-2-20 18:31
回复 9# xxpinqz
可以了,谢谢。还好这是平方米转公顷的,要是平方米转亩的,就惨了...
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |