我有2个txt文件,第一个是json文件的结果,第二个必须包含JSON的内容+其他TXT文件的内容。
database1.txt
word1
word2
word3
word8
Database2.txt(来自JSON)
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 dosnt找不到字。
有人可以帮我修理它还是可以告诉我更好的比较方法?
谢谢
答案 0 :(得分:0)
此脚本使用aacini称为Uniq.bat
的强大工具
@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;
}
}
答案 1 :(得分: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