BATCH FILE для удаления дублирующихся строк, содержащих двойные кавычки; и держите пустые строки - PullRequest
1 голос
/ 10 октября 2010

BATCH FILE для удаления дублирующихся строк (содержащих двойные кавычки); и держите пустые строки

Примечание. Конечный результат должен содержать исходные строки с двойными кавычками и пустыми строками.

Я давно работаю над этим и не могу найти решение, спасибо. заранее за вашу помощь. Когда я получу удаление дубликатов, работающих что-то еще не ... Я знаю, что, похоже, я не сделал много работы, но у меня есть обрезать это для ясности.


@echo on
REM -- Prepare the Command Processor --
SETLOCAL ENABLEEXTENSIONS
SETLOCAL EnABLEDELAYEDEXPANSION

REM -- Prepare the Prompt for easy debugging -- restore with prompt=$p$g
prompt=$g

rem The finished program will remove duplicates lines

:START
set "_duplicates=TRUE"

set "_infile=copybuffer.txt"
set                        "_oldstr=the"
set                                    "_newstr=and"

call :BATCHSUBSTITUTE %_infile% %_oldstr% %_newstr% 
pause
goto :SHOWINTELL
goto :eof


:BATCHSUBSTITUTE

type nul> %TEMP%.\TEMP.DAT

if "%~2"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %1|find /n /v """') do (
    set "_line=%%B"
    if defined _line (
        if "%_duplicates%"=="TRUE" (
            set "_unconverted=!_line!"
            set "_converted=!_line:"=""!"
            FIND "!_converted!" %TEMP%.\TEMP.DAT > nul
            if errorlevel==1 (
                >> %TEMP%.\TEMP.DAT echo !_unconverted!
            )
        ) 
    ) ELSE (
        echo(>> %TEMP%.\TEMP.DAT
    )
)
goto :eof


:SHOWINTELL
@echo A|move %TEMP%.\TEMP.DAT doubleFree.txt
start doubleFree.txt
goto :eof

Ввод: copybuffer.txt

this test 'data' may have a path C:\Users\Documents\30% full.txt 
this test 'data' may have a path C:\Users\Documents\30% full.txt 
this test 'data' may have duplicates 
this test 'data' may have duplicates 


this test 'data' may drive "YOU NUTS" 
this test 'data' may drive "YOU NUTS" 
this test 'data' may drive "YOU NUTS" 
this test 'data' may drive "YOU NUTS" 
this test 'data' may drive "YOU NUTS" 
this test 'data' may drive "YOU NUTS" 
this test 'data' may have Blank Lines 
this test 'data' may have Blank Lines 
this test 'data' may have "Double Quoted text" in the middle of the string 
this test 'data' may have "Double Quoted text" in and middle of and string 
this test 'data' may have "Trouble with the find" command 
this test 'data' may have "Trouble with and find" command 
this test 'data' may drive "YOU NUTS" 
this test 'data' may drive "YOU NUTS"

Фактический вывод: doubleFree.txt (Примечание: две последние строки НЕ являются дубликатами)

this test 'data' may have a path C:\Users\Documents\30% full.txt 
this test 'data' may have duplicates 


this test 'data' may drive "YOU NUTS" 
this test 'data' may have Blank Lines 
this test 'data' may have "Double Quoted text" in the middle of the string 
this test 'data' may have "Double Quoted text" in and middle of and string 
this test 'data' may have "Trouble with the find" command 
this test 'data' may have "Trouble with and find" command 

Ответы [ 2 ]

2 голосов
/ 10 октября 2010

Кажется, что основной проблемой является расширение специальных символов, таких как кавычки.

Этого можно избежать, используя расширение с задержкой, поэтому специальные символы игнорируются.(Не идеально здесь, но почти, есть только проблемы с восклицательными знаками и знаками вставки)

Следующая проблема - поиск строк с кавычками с помощью команды find.Вы должны удвоить их.

@echo off
REM -- Prepare the Command Processor --
SETLOCAL ENABLEEXTENSIONS
SETLOCAL EnABLEDELAYEDEXPANSION

REM -- Prepare the Prompt for easy debugging -- restore with prompt=$p$g
prompt=$g

rem The finished program will remove duplicates lines

:START
set "_duplicates=TRUE"

set "_infile=copybuffer.txt"
set                        "_oldstr=the"
set                                    "_newstr=and"

call :BATCHSUBSTITUTE %_infile% %_oldstr% %_newstr% 
pause
goto :SHOWINTELL
goto :eof


:BATCHSUBSTITUTE

type nul> %TEMP%.\TEMP.DAT
type nul> %TEMP%.\TEMP2.DAT

if "%~2"=="" findstr "^::" "%~f0"&GOTO:EOF
for /f "tokens=1,* delims=]" %%A in ('"type %1|find /n /v """') do (
    set "_line=%%B"
    if defined _line (
        if "%_duplicates%"=="TRUE" (
            set "_unconverted=!_line!"
            set "_converted=!_line:"=""!"

            FIND "!_converted!" %TEMP%.\TEMP.DAT > nul
            if errorlevel==1 (
                >> %TEMP%.\TEMP.DAT echo !_unconverted!
            )
            call set "_converted=%%_line:"=#%%"
        ) 
    ) ELSE (
        echo(>> %TEMP%.\TEMP.DAT
    )
)
goto :eof


:SHOWINTELL
@echo A|move %TEMP%.\TEMP.DAT doubleFree.txt
start doubleFree.txt
goto :eof
1 голос
/ 11 октября 2010

Используйте хороший инструмент для обработки файлов. Если у вас есть возможность загружать вещи, вы можете попробовать gawk для Windows.

C:\test> gawk "!a[$0]++ && $0~/\042|\047/|| !NF" file
this test 'data' may have a path C:\Users\Documents\30% full.txt
this test 'data' may have duplicates


this test 'data' may drive "YOU NUTS"
this test 'data' may have Blank Lines
this test 'data' may have "Double Quoted text" in the middle of the string
this test 'data' may have "Double Quoted text" in and middle of and string
this test 'data' may have "Trouble with the find" command
this test 'data' may have "Trouble with and find" command
this test 'data' may drive "YOU NUTS"

Если нет, то родные языки, такие как vbscript, еще лучше в пакетном режиме делать такие вещи.

strFile= WScript.Arguments(0)
Set objFS = CreateObject( "Scripting.FileSystemObject" )
Set d = CreateObject("Scripting.Dictionary")
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfStream
    strLine=objFile.ReadLine    
    If Not d.Exists(strLine) Then
        d.Add strLine, 1
    End If 
Loop
objFile.Close
For Each strkey In d.Keys       
    WScript.Echo strkey ',  d.Item(strkey) 
Next

Использование:

C:\test>cscript //nologo myscript.vbs file
...