Delete/Remove XML 中的重复行,但优先考虑具有特定 ID 值的所有条目

Delete/Remove duplicate lines in XML but prioritise all entries with certain ID value

我有两个 XML 文件,我在批处理文件中使用 powershell 命令合并了这两个文件,该批处理文件创建了具有以下结构的组合 XML 文件

<Supplier SupplierN="617428" ID="0002" Name1="John Doe" VAT="0123456789" />
<Supplier SupplierN="953434" ID="0002" Name1="Jane Doe" VAT="9876543210" />
<Supplier SupplierN="871007" ID="0002" Name1="Anna Smith" VAT="6355928947" />
<Supplier SupplierN="1067428" ID="0003" Name1="John Doe" VAT="0123456789" />
<Supplier SupplierN="1034" ID="0003" Name1="Jane Doe" VAT="9876543210" />
<Supplier SupplierN="60379" ID="0003" Name1="Peter Meyer" VAT="7478490345" />

现在,我想删除 ID="0003" 的所有重复增值税的行(已在 ID="0002" 中作为增值税提供)。

有人可以向我提供有关如何使用我可以在 Windows 任务计划程序中 运行 的批处理脚本实现此目的的帮助吗?

@ECHO Off
SETLOCAL
rem The following settings for the source directory and filenames are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "filename1=%sourcedir%\q72496621.txt"
SET "outfile=%sourcedir%\newfile.txt"
:: remove variables starting #
FOR  /F "delims==" %%b In ('set # 2^>Nul') DO SET "%%b="

FOR /f "usebackqdelims=" %%b IN ("%filename1%") DO (
 FOR %%e IN (id two vat) DO SET "%%e="
 FOR %%e IN (%%b) DO (
  IF DEFINED vat SET "#%%~e=Y"&SET "vat="
  IF DEFINED two IF /i "%%~e"=="VAT" SET vat=Y
  IF DEFINED id SET "id="&IF /i "%%~e"=="0002" SET two=Y
  IF /i "%%~e"=="id" SET "id=Y"
 )
)
(
FOR /f "usebackqdelims=" %%b IN ("%filename1%") DO (
 FOR %%e IN (id three vat skipme) DO SET "%%e="
 FOR %%e IN (%%b) DO (
  IF DEFINED vat IF DEFINED #%%~e SET "skipme=Y"&SET "vat="
  IF DEFINED three IF /i "%%~e"=="VAT" SET vat=Y
  IF DEFINED id SET "id="&IF /i "%%~e"=="0003" SET three=Y
  IF /i "%%~e"=="id" SET "id=Y"
 )
 IF NOT DEFINED skipme ECHO %%b
)
)>"%outfile%"

TYPE "%outfile%"

GOTO :EOF

通常情况下,如果没有尝试,我不会解决任何问题,但我很无聊..

虽然提供的数据样本中所有 0002 项都出现在 0003 之前,但没有迹象表明这是正常情况,或者 data-generation 的结果方法。因此,我设计此响应时假设数据可以按任何顺序出现。

首先,清除所有以#开头的变量,以便以#开头的变量可以用作标志。通常,可能不存在以 # 开头的变量,因此 2^>nul 会抑制没有找到此类变量的错误报告。

下一步:将源文件读取到 %%b,然后清除一组标志并使用 %%e 遍历标记。在找到每个字段时按该顺序设置标志(id、两个、vat),然后将数字上的#vatnumber设置为“Y”——但前提是该行包含“id” , "0002" 和 "vat" - 按此顺序。

然后:重复配方,这次仅当“id”、“0003”和“vat”出现在行中并且#[=31 时检测0003 并设置skipme 标志=]vatnumber 已在上一步中设置。