我正在尝试在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
}
请你帮我处理相当于遍历每个奇数行和偶数行的批处理文件。
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为q50041056.txt
的文件,其中包含我的测试数据。
生成定义为%outfile%
的文件仅需要usebackq
选项,因为我选择在源文件名周围添加引号。
此解决方案使用if defined
解释变量名的当前状态的事实,因此所讨论的变量只是在值和 nothing 之间切换。