我遇到了CSV文件问题,感觉批处理可以提供帮助。 我的CSV文件有六个值(%a-%f) 除了其他问题之外,我必须在我的CSV文件中根据第一个值(一个字符串)手动创建数据剪切和粘贴(穴居人样式)。 其他值是整数,所以希望这简化了我的任务。
我的意思是根据%a
手动创建数据我的%字符串是丑陋的,反之亦然,它包含整数和连字符
示例:
00-text-00-000
我的%a所需的字符串格式是这样的:
ww-xx-yy-zzz
ww,yy和zzz就像整数一样反击。 xx是随机文本。
这是我的问题的设置,这是我的主要目标。
如果我的CSV文件中%a的yy部分是01,02或03,我需要将这些整行值复制并添加到我的CSV文件作为新数据。但这里是真正的踢球者。 yy的值现在需要为新数据更改,因此它不是精确的副本
01 needs to be 07
02 needs to be 06
03 needs to be 05
因此我的CSV文件以缺少这样的数据开头:
00-text-00-000
00-text-00-001
00-text-01-000
00-text-01-001
00-text-02-000
00-text-02-001
00-text-03-000
00-text-03-001
00-text-04-000
00-text1-00-000
00-text1-00-001
00-text1-01-000
...
之后它有%a的新数据:
00-text-00-000
00-text-00-001
00-text-01-000
00-text-01-001
00-text-02-000
00-text-02-001
00-text-03-000
00-text-03-001
00-text-04-000
00-text-04-001
00-text-05-000
00-text-05-001
00-text-06-000
00-text-06-001
00-text-07-000
00-text-07-001
除了%a之外,新行将是相同的,除了每次01到07,02到06和03到06之间的变化,如前所述。
但并非全部,%b值也需要改变。相同的数字,但其符号相反。所以任何负面的%b都会转为正面,反之亦然。 所以我的数据总是这样开始:
00-text-00-000,1,2,3,4,5
00-text-00-001,-1,2,3,4,5
00-text-01-000,-2,-1,2,1
00-text-01-001,3,1,3,1
00-text-02-000,4,4,4,4
00-text-02-001,-4,-4,4,4
00-text-03-000,-5,-6,5,5
00-text-03-001,6,6,6,6
00-text-04-000,-6,-6,6,6
00-text-04-001,4,5,6,7
结束这样:
00-text-00-000,1,2,3,4,5
00-text-00-001,-1,2,3,4,5
00-text-01-000,-2,-1,2,1
00-text-01-001,3,1,3,1
00-text-02-000,4,4,4,4
00-text-02-001,-4,-4,4,4
00-text-03-000,-5,-6,5,5
00-text-03-001,6,6,6,6
00-text-04-000,-6,-6,6,6
00-text-04-001,4,5,6,7
00-text-05-000,5,-6,5,5
00-text-05-001,-6,6,6,6
00-text-06-000,-4,4,4,4
00-text-06-001,4,-4,4,4
00-text-07-000,2,-1,2,1
00-text-07-001,-3,1,3,1
批次可以实现这一点吗?
答案 0 :(得分:3)
@ECHO Off
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q36214264.csv"
SET "outfile=%destdir%\outfile.csv"
(
FOR /f "usebackqtokens=1,2*delims=," %%a IN ("%filename1%") DO (
REM this reproduces the original line
ECHO(%%a,%%b,%%c
REM tokenise the first column
SET "new1="
FOR /f "tokens=1-4 delims=-" %%p IN ("%%a") DO (
IF %%r==01 SET "new1=%%p-%%q-07-%%s"
IF %%r==02 SET "new1=%%p-%%q-06-%%s"
IF %%r==03 SET "new1=%%p-%%q-05-%%s"
)
REM calculate -%%b
SET /a new2=-%%b
REM new output - only if column 1 was changed
IF DEFINED new1 ECHO(!new1!,!new2!,%%c
)
)>"%outfile%"
GOTO :EOF
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为q36214264.txt
的文件,其中包含我的测试数据。
生成定义为%outfile%
的文件处理由评论描述。
使用delayedexpansion
,您可以在循环内更改变量值。也可以使用子程序来完成。
此例程以“原始”形式输出数据。如果你想对它进行排序,请对其进行排序。
答案 1 :(得分:1)
@echo off
setlocal EnableDelayedExpansion
rem Define the corresponding indices in the new YY parts
set "newYY[01]=07"
set "newYY[02]=06"
set "newYY[03]=05"
set "lastXX="
rem Read an input line and separate it in the specified tokens
(for /F "tokens=1-6 delims=," %%a in (input.csv) do (
for /F "tokens=1-4 delims=-" %%w in ("%%a") do (
rem If a new data set started
if "%%x" neq "!lastXX!" (
rem If there is new data from previous set
if defined lastXX (
rem Copy it
for /F "tokens=1,2 delims==" %%m in ('set newData[') do (
echo %%n
set "%%m="
)
)
rem Start the new set
set "lastXX=%%x"
)
rem If this data must be duplicated
if defined newYY[%%y] (
rem Duplicate it, as specified
set /A newB=-%%b
set "newData[!newYY[%%y]!-%%z]=%%w-%%x-!newYY[%%y]!-%%z,!newB!,%%c,%%d,%%e,%%f"
)
rem Copy this data
echo %%a,%%b,%%c,%%d,%%e,%%f
)
)) > output.csv
rem Copy the new data from last set
(for /F "tokens=2 delims==" %%n in ('set newData[') do echo %%n) >> output.csv