2016-10-10 53 views
-1

我遇到了下面的代碼在線,並修改了我的需要。 我只想問一下,因爲我是新的批處理文件,如果有一種方法可以刪除聯合後的重複值。刪除重複值csv上結合

@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

請閱讀整個[旅遊網頁](http://stackoverflow.com/tour)以及幫助主題[我如何提出一個好問題?](http://stackoverflow.com/help/how問),學習如何使用本網站! – aschipfl

+0

你指的是標題行。如果是這樣,您可以刪除全部並在頂部添加一個標題行。 – 2016-10-10 13:30:10

回答

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完全匹配/l從字面上/g:filenamecombined.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:,因此findstr輸出使用了另一個臨時文件##.vsc

請注意,(標題)Last modifieddate以及其他地方之間的Unicode字符將被問號替換。

+0

按照您的建議運行蝙蝠,會發生什麼情況,其他文件的標題仍然存在。 並且仍有重複文件 – Indio

+0

文件頭是否相同? – Magoo

+0

是的標題是相同的,我多次檢查。 – Indio