在合并

时间:2016-10-10 13:21:32

标签: batch-file cmd

我在网上遇到了以下代码,并根据我的需要进行了修改。 我只是想问,因为我是批处理文件的新手,如果有一种方法可以在合并后删除重复的值。

@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
)

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 modifieddate之间以及其他地方的unicode字符将替换为问号。