2014-06-07 2 views
0

두 개의 txt 파일이 있습니다. 첫 번째 파일은 json 파일의 결과이고 두 번째 파일에는 JSON의 내용 + 다른 TXT 파일의 내용이 있어야합니다.TXT 파일 비교 및 ​​누락 된 단어 받기

:

는 database1.txt (JSON)에서

word1 
word2 
word3 
word8 

Database2.txt

word1 
word5 
word7 
word8 

Database3.txt (Database1 + DATABASE2) 여기

Word1 
Word2 
Word3 
Word5 
Word7 
Word8 

내 코드입니다
@ECHO OFF 
setlocal enabledelayedexpansion 
IF EXIST "%LOCALAPPDATA%\xxx\xxx\database.json". (

for /f "delims=" %%a in ('type "%LOCALAPPDATA%\xxx\xxx\database.json"') do for %%b in (%%a) do (
ECHO %%b >>json.tmp 
) 

for /f "tokens=* skip=1 delims= " %%a in (json.tmp) do (
call :sub1 %%a 

>> Json_cl.txt echo.!S! 
) 

set row= 
for /F "delims=" %%j in (Json_cl.txt) do (
    if defined row echo.!row!>>Password_JD.txt 
    set row=%%j 
) 


findstr /V /g:"Password_list.txt" "Password_JD.txt">1.out 
     type Password_list.txt 1.out>Updated_PW.txt 

del Json_cl.txt 
del json.tmp 
del Password_JD.txt 
del 1.out 
goto :eof 

:sub1 
set S=%* 
set S=!S:"=! 

goto :eof 
) 

코드는 제대로 작동하지만 FINDSTR 코드가 누락 된 단어를 찾은 것처럼 보이는 경우가 있습니다.

나를 고칠 수있는 사람이 있습니까? 아니면 더 나은 방법을 비교할 수 있습니까?

이 스크립트에 의해 라는 강력한 도구를 사용하면

답변

0

감사 aacini

@echo off 
copy database1.txt + database2.txt tmp.txt >nul 
type tmp.txt | sort |uniq >database3.txt 
del tmp.txt 

UNIQ.BAT

@if (@CodeSection == @Batch) @then 

@CScript //nologo //E:JScript "%~F0" & goto :EOF & Rem aacini 2013 

@end 

var line, prevLine = ""; 
while (! WScript.Stdin.AtEndOfStream) { 
    line = WScript.Stdin.ReadLine(); 
    if (line != prevLine) { 
     WScript.Stdout.WriteLine(line); 
     prevLine = line; 
    } 
} 
+0

으로 변경하여 해결할 수 있습니다. SORT는 대소 문자를 구분하지 않으므로 안정적으로 작동하지 않습니다. SORT는 다음 시퀀스를 산출 할 수 있습니다 :'A A'와 UNIQ.BAT는 세 개의 값을 모두 보존하지만'A a' 만 원할 것입니다. 내 [JSORT.BAT] (http://www.dostips.com/forum/viewtopic.php?f=3&t=5595)는 대소 문자 구분 문제를 해결하는 데 사용할 수 있지만 OP에 여전히 문제가있을 수 있다고 생각합니다. 일부 줄에 여분의 공백이 있습니다. – dbenham

+0

@dbenham 문제가 제기되면 해결됩니다. '까다로운 질문'은 종종 '대답 할 수없는 대답'으로 이어집니다. – foxidrive

+0

질문에 대한 글자 그대로가된다면 문제는 해결되지 않을 것입니다. 텍스트 입력은 모두 소문자이며 최종 출력은 대소 문자가 혼합되어 있기 때문입니다. 그러나 그것이 OP의 의도라고 생각하지 않습니다. 또한 코드가 암호를 참조한다는 사실은 대부분의 암호가 대소 문자를 구분하므로 대소 문자가 중요 할 수 있음을 의미합니다. 그러나 그 질문은 더 잘 쓰여질 수 있다고 동의했다. – dbenham

0

문제 1 : 최종 출력에 중복 단어에 대한 잠재적 인

FINDSTR은 불쾌한 버그가 있습니다 - 다양한 길이의 여러 리터럴 검색 문자열과 일치하는 경우 일부 일치가 누락 될 수 있습니다. 명시 적으로 정규식이나 리터럴 검색을 지정하지 않으므로/G 파일의 첫 번째 줄에 정규식 메타 문자가 포함되어 있으면 FINDSTR에서 정규 표현식 검색을 수행합니다. 그렇지 않으면 리터럴 검색이 수행됩니다. 버그와 리터럴 대 정규식 문제에 대한 자세한 내용은 What are the undocumented features and limitations of the Windows FINDSTR command?을 참조하십시오.

여러 검색 문자열에 대해 FINDSTR을 사용하려는 경우 /L 옵션을 사용하여 리터럴 검색을 명시 적으로 수행하고 /I 옵션을 사용하여 대소 문자를 구분하지 않고 검색해야합니다. 물론 암호가 대소 문자를 구분하는 경우에는 허용되지 않습니다.

암호가 대소 문자를 구분하는 경우 /R 옵션을 사용하는 대신 정규식 검색을 수행 할 수 있지만 검색 문자열에 정규식 메타 문자가 포함되지 않았는지 또는 모든 메타 문자 선행 백 슬래시 \으로 이스케이프 처리해야합니다.

이스케이프해야 할 정규식 메타 문자는 . *^$ [ \입니다. 그러나 *과 관련된 검색 및 바꾸기 작업은 매우 어렵습니다. 그러나 간단한 FOR 루프가 * 또는 ?을 포함하는 단어를 손상 시키므로이 문제가 발생하지 않아야합니다. 그렇지 않으면 JSON 파서가 실패합니다.

문제 2 : 기본적으로 최종 출력

에서 누락 된 단어, FINDSTR 어디 목표 라인 내에서 검색 문자열을 찾습니다.따라서 WIN과 같은 단어는 TWINS와 일치합니다. JSON 파일에 TWINS가 포함되어 있으면 암호 파일에 WIN이라는 새 단어가 출력되지 않습니다.

해결책은 FINDSTR /X 옵션과 정확히 일치시키는 것입니다. 하지만 JSON 구문 분석기가 각 단어의 끝에 공백을 추가하기 때문에 잠재적 인 공간 문제가 발생합니다. ECHO %%b >>json.tmpECHO %%b>>json.tmp