批处理程序可以对CSV执行此操作吗?

时间:2016-03-25 04:59:00

标签: csv batch-file

我遇到了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 

批次可以实现这一点吗?

2 个答案:

答案 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

您需要更改sourcedirdestdir的设置以适合您的具体情况。

我使用了一个名为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