向csv添加新列并填充值替代项

时间:2018-04-26 10:47:37

标签: batch-file

我正在尝试在Windows中编写一个批处理文件,该文件在CSV文件的开头复制/附加一个新列。然后交替填充值0和1

例如:

F1,F2,F3
1,2,3
1,2,3
2,3,4
3,4,5

现在我想首先添加一个新列并为它们添加值 前

F0,F1,F2,F3
0,1,2,3
1,1,2,3
0,2,3,4
1,3,4,5

只为所有偶数行追加0,为所有奇数行追加1

下面是我编写的代码,但只是将0添加到所有行,但我想要0和1交替

@echo off > newfile.csv & setLocal enableDELAYedeXpansion
for /f "tokens=* delims= " %%a in (J_CAFE27032018_090325.csv) do (
>> newfile.csv echo a,%%a
)

等效的c将为所有偶数列和奇数列设置for循环

for(i=0;i<n;i+2)
 {
   add 0
 }
for(i=0;i<n;i++)
 {
   add 0
 }

请你帮我处理相当于遍历每个奇数行和偶数行的批处理文件。

4 个答案:

答案 0 :(得分:2)

此方法与Aacini相同,但它会在标题行前加上#,(可以修改)

@Echo Off & SetLocal EnableDelayedExpansion
Set "i=" & (For /F "UseBackQ Delims=" %%A In ("J_CAFE27032018_090325.csv") Do (
    If Defined i (Echo !i!,%%A) Else Set "i=1" & Echo #,%%A
    Set /A "i=(i+1)%%2"))>newfile.csv & Exit /B

答案 1 :(得分:1)

我会按以下方式执行此操作 - 假设输入CSV文件(data.csv)的任何行超过1021个字符/字节的总长度:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_FILE=%~1" & rem // (CSV file to process; use first argument)
set "_SEP=,"    & rem // (separator character)
set "_HEAD=F0"  & rem // (header text for new column)
set /A "_MOD=2" & rem // (divisor for modulo operation)
set /A "_OFF=0" & rem // (offset for modulo operation)

setlocal EnableDelayedExpansion
rem // Determine number of lines contained in CSV file:
for /F %%C in ('^< "!_FILE!" find /C /V ""') do set /A "COUNT=%%C"
rem // Read from CSV file:
< "!_FILE!" (
    rem // Check whether header text is defined:
    if defined _HEAD (
        rem // Header text defined, so read current header:
        set "LINE=" & set /P LINE=""
        rem // Prepend header text for new column to current line:
        echo(!_HEAD!!_SEP!!LINE!
        rem // Decrement number of lines:
        set /A "COUNT-=1"
    )
    rem // Process remaining lines in a loop:
    for /L %%I in (1,1,!COUNT!) do (
        rem // Read current line:
        set "LINE=" & set /P LINE=""
        rem // Perform modulo operation:
        set /A "NUM=(%%I+_OFF-1)%%!_MOD!"
        rem // Prepend remainder of division to current line:
        echo(!NUM!!_SEP!!LINE!
    )
)
endlocal

endlocal
exit /B

此方法使用input redirection从输入CSV文件中读取。

要将输出写入另一个CSV文件,例如data-mod.csv,而不是控制台,请使用以下命令行,假设脚本名为prepend-modulo.bat且输入CSV文件名为{{ 1}},并且都位于当前目录中:

data.csv

答案 2 :(得分:1)

这是以下几种方法之一:

@echo off & setLocal enableDELAYedeXpansion
set "i=0"
(for /f "delims=" %%a in (J_CAFE27032018_090325.csv) do (
   echo !i!,%%a
   set /A "i=(i+1)%%2"
)) > newfile.csv 

但是你原来的逻辑dos没有正确处理标题(第一行)......

答案 3 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q50041056.txt"
SET "outfile=%destdir%\outfile.txt"
SET "firstline=Y"
SET "zerostart=Y"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 IF DEFINED firstline (
  ECHO F0,%%a
  SET "firstline="
 ) ELSE (
  IF DEFINED zerostart (
   ECHO 0,%%a
   SET "zerostart="
  ) ELSE (
   ECHO 1,%%a
   SET "zerostart=Y"
  )
 )
)
)>"%outfile%"

GOTO :EOF

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

我使用了一个名为q50041056.txt的文件,其中包含我的测试数据。

生成定义为%outfile%

的文件

仅需要usebackq选项,因为我选择在源文件名周围添加引号。

此解决方案使用if defined解释变量名的当前状态的事实,因此所讨论的变量只是在值和 nothing 之间切换。