首先,如果我不能用英语表达自己,请原谅我。
我在批量处理首次亮相,我需要帮助制作剧本
我的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
答案 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
的因素,因此,目标字段75000
和30000
位于%%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
中。