我在网上遇到了以下代码,并根据我的需要进行了修改。 我只是想问,因为我是批处理文件的新手,如果有一种方法可以在合并后删除重复的值。
@echo off
ECHO Set working directory
pushd %~dp0
ECHO Deleting existing combined file
del combined.csv
setlocal ENABLEDELAYEDEXPANSION
set cnt=1
for %%i in (*.csv) do (
if !cnt!==1 (
for /f "delims=" %%j in ('type "%%i"') do echo %%j >> combined.csv
) else if %%i NEQ combined.csv (
for /f "skip=1 delims=" %%j in ('type "%%i"') do echo %%j >> combined.csv
)
set /a cnt+=1
)
答案 0 :(得分:0)
@ECHO OFF
SETLOCAL
ECHO Set working directory
pushd %~dp0
ECHO Deleting existing combined file
del combined.csv
set "flag="
for %%i in (*.csv) do if %%i NEQ combined.csv (
IF DEFINED flag (
findstr /l /x /v /g:combined.csv "%%i">#.vsc
TYPE #.vsc >>combined.csv
) ELSE (
COPY "%%i" combined.csv >nul
SET flag=y
)
)
DEL #.vsc /F /Q
POPD
GOTO :EOF
这可能更适合你。
它使用简单的setlocal
而不是delayedexpansion
版本,初始化flag
到为空然后在循环中设置它并使用if defined
它适用于flag
的运行时值。
首次,它只是将检测到的源文件复制到combined.csv
,然后将flag
设置为一个值,以便它定义< /强>
每隔一段时间,findstr
输出源文件%%i
中/v
做不 /x
完全匹配{{1}的那些行字面/l
/g:filename
文件中的combined.txt
个临时文件我被提名为#.vsc
(名称不重要)。然后将 文件附加到combined.csv
因此,如果任何特定的.csv
内部没有重复的行,combined.csv
也将没有重复的行。
由于标题行在每个文件中显然都相同,因此第一个文件的初始copy
会将标题放入combined.csv
,因此findstr
会在此后巧妙地将其排除。
对抗邪恶unicode的修订:
@ECHO OFF
SETLOCAL
ECHO Set working directory
pushd %~dp0
ECHO Deleting existing combined file
del combined.csv
set "flag="
for %%i in (*.csv) do if %%i NEQ combined.csv (
(FOR /f "delims=" %%j IN ('type "%%i"') DO ECHO %%j)>#.vsc
IF DEFINED flag (
findstr /l /x /v /g:combined.csv "#.vsc" >##.vsc
TYPE ##.vsc>>combined.csv
) ELSE (
REN #.vsc combined.csv
SET flag=y
)
)
DEL #.vsc /F /Q
DEL ##.vsc /F /Q
POPD
GOTO :EOF
我怀疑问题是在你的文件中使用UNICODE。剪切和粘贴数据表明它是unicode。
for /f...
仪式读取unicode并生成ASCII,因此该版本首先使用您熟悉的技术转换为ASCII,然后对转换后的文件#.vsc
进行操作。 findstr
不希望输出到尝试读取为/g:
的同一文件,因此##.vsc
输出会使用另一个临时文件findstr
。< / p>
请注意,(标题)Last modified
和date
之间以及其他地方的unicode字符将替换为问号。