批处理脚本如何在数字变量上添加空间

时间:2016-01-06 01:53:47

标签: batch-file

首先,如果我不能用英语表达自己,请原谅我。

我在批量处理首次亮相,我需要帮助制作剧本

我的articles.txt检索有多行的文档。 我文档的某些部分

"T0047" ;"Tuyau 1km";"Marque2";"jardinage";"75 000";"promo"
"T00747";"Tuyau 1m";Marque2";"jardinage";"30 000";"promo"

首先,我必须删除文件中的引号。 它完成了:

@echo off
setlocal enabledelayedexpansion
for /F "delims=" %%a in (articles.txt) do (
        set a=%%a
        set a=!a:"=!
        echo !a!
    echo !a! >>resultat.txt
)

结果

T0047 ;Tuyau 1km;Marque2;jardinage;75 000;promo
T00747;Tuyau 1m;Marque2;jardinage;30 000;promo

然后我必须对列进行乘法运算。 为此,我遇到的问题是,如果空间不是那么多,我会创建一个删除空格的脚本。

@echo off
setlocal enabledelayedexpansion
for /F "delims=; tokens=1-8" %%a in (resultat.txt) do (
        set a=%%e
    set a=!a: =!
        echo %%a;%%b;%%c;%%d;!a!;%%f;%%g;%%h
    echo %%a;%%b;%%c;%%d;!a!;%%f;%%g;%%h >>resultat2.txt
)

结果

T0047 ;Tuyau 1km;Marque2;jardinage;75000;promo
T00747;Tuyau 1m;Marque2;jardinage;30000;promo

然后我进行了乘法运算。

@echo off
setlocal enabledelayedexpansion
for /F "delims=; tokens=1-8" %%a in (resultat2.txt) do (
        set a=%%e
        :: set /a a=!a!/0.6
         set /a a=!a!*16666/10000
    echo %%a;%%b;%%c;%%d;!a!;%%f;%%g;%%h
    echo  %%a;%%b;%%c;%%d;!a!;%%f;%%g;%%h >>resultat3.txt
)

结果

T0047 ;Tuyau 1km;Marque2;jardinage;124995;promo
T00747;Tuyau 1m;Marque2;jardinage;49998;promo

现在,我在第一个colomn

之后添加一些文字
set champ2=MAGASIN_1;T
for /F "delims=; tokens=1,*" %%a in (resultat3.txt) do (
        echo %%a;%champ2%;%%b
        echo %%a;%champ2%;%%b >>resultat_final.txt
)

实际结果是:

T0047 ;MAGASIN_1;T;Tuyau 1km;Marque2;jardinage;124995;promo
T00747;MAGASIN_1;T;Tuyau 1m;Marque2;jardinage;49998;promo

现在我要添加一个空格,以使图形更具可读性。

T0047 ;MAGASIN_1;T;Tuyau 1km;Marque2;jardinage;124 995;promo
T00747;MAGASIN_1;T;Tuyau 1m;Marque2;jardinage;49 998;promo

4 个答案:

答案 0 :(得分:0)

这就是我这样做的方式:

@echo off
setlocal EnableDelayedExpansion

for /F "delims=" %%A in (articles.txt) do (
   set "a=%%A"
   set a=!a:"=!
   for /F "delims=; tokens=1-8" %%a in ("!a!") do (
      set /A "g1=%%g*16666/10000"
      set "g2="
      for /L %%i in (1,1,3) do if defined g1 (
         set "g2= !g1:~-3!!g2!"
         set "g1=!g1:~0,-3!
      )
      echo %%a;%%b;%%c;%%d;%%e;%%f;!g2:~1!;%%h
      echo %%a;%%b;%%c;%%d;%%e;%%f;!g2:~1!;%%h >> result.txt
   )
)

articles.txt:

"T0047" ;"MAGASIN_1";"T";"Tuyau 1km";"Marque2";"jardinage";"75000";"promo"
"T00747";"MAGASIN_1";"T";"Tuyau 1m";Marque2";"jardinage";"30000";"promo"

的Result.txt:

T0047 ;MAGASIN_1;T;Tuyau 1km;Marque2;jardinage;124 995;promo 
T00747;MAGASIN_1;T;Tuyau 1m;Marque2;jardinage;49 998;promo 

答案 1 :(得分:0)

我只会对乘法部分做出回应。

我的代码中什么也看不到可能会导致两个额外列;MAGASIN_1;T的因素,因此,目标字段7500030000位于%%g,而不是%%e {1}}。

注释:请勿在块语句::comment中使用“已损坏标签”注释表单(a parenthesised series of statements),因为它可能会过早终止块。始终将rem与块一起使用。

经过修改的代码%%g

set a=%%g
rem set /a a=!a!/0.6
REM set /a a=!a!*16666/10000
set /a a=!a!*10/6
SET "a= !a:~-9,-6! !a:~-6,-3! !a:~-3!"
FOR /f "tokens=*" %%q IN ("!a!") DO SET "a=%%q"
echo %%a;%%b;%%c;%%d;%%e;%%f;!a!;%%h

原因:Batch有一个32位的有符号限制,所以如果源字段是> ~120000,那么你的计算将生成一个负数(例如尝试130000)修改后的计算更准确,因为中间结果是不太可能超过2 ** 31可以应对%%g字段中较大的值。

计算后的set会将a中的数值更改为

  

space (百万) space (千) space (units)

(语法SET "var=value"(其中value可以为空)用于确保所分配的值中不包含任何杂散尾随空格。set /a可以安全地使用“无报价”。)< / p>

for /f "tokens=*"...语句只是从a的值中删除前导空格。

通过另外两列的说明,这个版本应解决“添加空间”问题:

set a=%%e
rem set /a a=!a!/0.6
REM set /a a=!a!*16666/10000
set /a a=!a!*10/6
SET "a= !a:~-9,-6! !a:~-6,-3! !a:~-3!"
FOR /f "tokens=*" %%q IN ("!a!") DO SET "a=%%q"
echo %%a;%%b;%%c;%%d;!a!;%%f;%%g;%%h

但是,如果您想跳过最后一步(插入2个额外字段),请在“乘法”批次中的for行之前插入此行

set champ2=MAGASIN_1;T

并将该批次中的echo行更改为

echo %%a;%champ2%;%%b;%%c;%%d;!a!;%%f;%%g;%%h

答案 2 :(得分:0)

你的节目很好。一些提示:

不要除以10的幂。相反,如果你不想要它,请删除小数部分。使用* =。并获得数字中的空格:

@echo off

set x=75000
set /a x *= 16666
set x=%x:~0,-4%
echo %x:~0,-3% %x:~-3%

答案 3 :(得分:0)

由于您有一个以分号分隔的值列表,其中每个项都用引号括起来,我会选择标准for来获取每行的项目并删除带括号的引号。这种方法的最大优点是它真正关心引号,因此列表项甚至可以包含自己的分号。唯一的缺点是任何列表项都不允许出现问号和星号:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Redirect all data to output file "resultat.txt" at once:
> "resultat.txt" (
    rem Loop through all (non-empty) lines of input file "articles.txt":
    for /F "usebackq delims=" %%L in ("articles.txt") do (
        rem Reset list collector and loop index:
        set "LIST="
        set /A "INDEX=0"
        rem Loop through the list items of the current line:
        for %%I in (%%L) do (
            rem Apply current list item with `""` removed, increment loop index:
            set "ITEM=%%~I"
            set /A "INDEX+=1"
            rem Do numeric calculation for a certain list item:
            setlocal EnableDelayedExpansion
            if !INDEX! EQU 5 (
                rem Convert item to a number, avoid error messages:
                2> nul set /A "CALC=!ITEM!"
                rem Do calculation with rounding (for negative and positive numbers):
                if !CALC! LSS 0 (
                    set /A "CALC=(!CALC!*10-6/2)/6"
                ) else (
                    set /A "CALC=(!CALC!*10+6/2)/6"
                )
                rem Insert thousands separators (space) between every third digit:
                set "CALC=!CALC:~-12,-9! !CALC:~-9,-6! !CALC:~-6,-3! !CALC:~-3!"
                for /F "tokens=*" %%N in ("!CALC!") do (
                    set "ITEM=%%N"
                )
            )
            rem Append separator (semicolon) and current item to list:
            for /F delims^=^ eol^= %%S in ("!LIST!;!ITEM!") do (
                endlocal
                set "LIST=%%S"
            )
        )
        rem Return built list, remove superfluous leading separator (`;`):
        setlocal EnableDelayedExpansion
        echo(!LIST:~1!
        endlocal
    )
)
endlocal
exit /B

此处的计算包括舍入到最接近的整数,即使对于负输入数也是如此。

新生成的列表存储在新文件resultat.txt中。