2014-06-07 22 views
0

我有2個txt文件,第一個是json文件的結果,第二個文件必須包含JSON的內容+其他TXT文件的內容。比較TXT文件並找不到文字

database1.txt

word1 
word2 
word3 
word8 

Database2.txt(從JSON)

word1 
word5 
word7 
word8 

Database3.txt(數據庫1 +的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 dosnt發現丟失的單詞。

有人可以幫我解決它或可以告訴我一個更好的方法來比較嗎?

謝謝

回答

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選項來執行正則表達式搜索,但是必須確保任何搜索字符串都不包含正則表達式元字符,否則所有元字符必須使用前導反斜槓\進行轉義。

必須轉義的正則表達式元字符爲:. *^$ [ \。 但批量搜索和替換涉及*是極其困難的。但是,這肯定不是問題,否則你的JSON解析器會失敗,因爲簡單的FOR循環會破壞包含*?的單詞。

問題2:字從最終的輸出

缺少默認情況下,FINDSTR將查找搜索字符串的目標線內的任何地方。所以像WIN這樣的詞會匹配TWINS。因此,如果您的JSON文件包含TWINS,則密碼文件中的新單詞WIN將無法顯示在輸出中。

解決方案將與FINDSTR /X選項完全匹配。但是,那麼你有一個潛在的空間問題,因爲你的JSON解析器在每個單詞的末尾添加了一個空格。可以通過將ECHO %%b >>json.tmp更改爲ECHO %%b>>json.tmp