加入csv文件中匹配记录的批处理脚本



我有一个.csv文件,有4个字段。

字段1、2和3是文本框

字段4为数字,如1、2、3等。

对于多个记录,字段1、2和3有多个实例是完全相同的。在这些情况下,我想删除除一条记录外的所有记录,并将其他(现已删除)记录的数字添加到剩余一条记录的末尾。

试着给出一个例子:

A,B,C,1
A,B,C,2
A,B,C,3
D,E,F,1
D,E,F,3

我想要

A,B,C,"1,2,3"
D,E,F,"1,3"

我一直在寻找解决方案,在这一点上几个小时,已经得到了旁边无处(我完全陌生的脚本),据我所知,我可能需要使用for /f命令或findstr命令,在某些条件下,但我真的很挣扎在哪里甚至开始。

@ECHO OFF
setlocal enabledelayedexpansion 
for /f "tokens=1-3,* delims=," %%a in (t.csv) do (
set "_%%a,%%b,%%c=!_%%a,%%b,%%c!%%d,"
)
(for /f "tokens=1,2 delims=_=" %%a in ('set _') do (
set "D=%%b
echo %%a,"!D:~0,-1!"
))>output.csv

第一个循环收集数据(将列4添加到名为"column1到3"的变量中)。
第二个循环打印变量名(= "列1到列3")加上收集的"列4",同时删除最后一个逗号并添加引号,并将整个循环的输出重定向到一个文件。

带有示例数据的输出:

A,B,C,"1,2,3"
D,E,F,"1,3"
@ECHO OFF
SETLOCAL
rem The following settings for the directories and filename are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.
SET "sourcedir=u:your files"
SET "destdir=u:your results"
SET "filename1=%sourcedir%q74435774.txt"
SET "outfile=%destdir%outfile.txt"
SET "field1="
(
FOR /f "delims=" %%e IN ('sort "%filename1%"') DO CALL :compare %%e
)
IF DEFINED field1 ECHO %field1%,%field2%,%field3%,"%field4:~1%"
)>"%outfile%"
GOTO :EOF
:compare
IF "%1,%2,%3" neq "%field1%,%field2%,%field3%" (
IF DEFINED field1 ECHO %field1%,%field2%,%field3%,"%field4:~1%"
SET "field1=%1"
SET "field2=%2"
SET "field3=%3"
SET "field4="
)
SET "field4=%field4%,%4"
goto :eof

在应用于实际数据之前,始终针对测试目录进行验证。

读取每一行和call:compare子程序,以整行作为参数。由于数据是逗号分隔的,因此每个字段都成为一个参数。

检查前3个参数串在一起是否匹配最后报告的字段1..3。如果没有,我们有一个新的组合,所以报告最后一个组合并初始化一个新组合。

然后累计新的字段4.

field1被初始化为nothing,可以用作标志来指示第一行是否已被处理。

数据由sort命令排序(如果源数据可能包含相同的行,请添加未记录的/unique开关),因此数据将始终呈现给:compare,按field1..3分组。

for将在数据结束时完成,但最后一项将没有报告,因此有必要再执行一次echo

Fields4将与前导一起累积,因此当echo显示时,我们只需跳过该字符。

for和最后的if用圆括号括起来,形成一个code block,允许echo重定向到一个文件。

相关内容

  • 没有找到相关文章

最新更新