好的,这是设置:
Stamps.com运输软件将每个Marketplace的订单存储在一个“.b”文件中,该文件在结构中是一个没有换行符的XML文件 - 因此它是一个非常非常长的字符串。
但该软件并非旨在允许非Stamps.com发货的订单 - 因此UPS或FedEx发货的订单仍保留在数据库中。
并且Stamps.com不会在下次导入时重新验证订单 - 如果订单在市场中被标记为已取消,它将不会在软件中移至“已取消”状态,也不会按顺序移动“已发货”使用“发货”的竞争对手的有效追踪号码 - 所以我需要逐个手动检查UPS / FedEx的每个订单。
这就是我需要的:
我在一天结束时从UPS出口。我想从此文件中获取订单号列,并使用脚本从Stamps.com数据库文件中删除该记录。
正如我所说,XML文件是一行没有中断的,我不确定我是否可以在这里重新发布文件中的记录信息 - 但只需从单个记录中说出所有内容包含在“......”和“......”之间。它包含“[data]”中的订单ID。
所以我有一个带有唯一可识别字符串的记录的开头和结尾。我有一个当天发货的订单ID列表。如何创建一个脚本(Batch,VBScript等)来删除包含该字符串的XML数据库中的所有条目?它可以节省大量时间来激活代码以自动删除无关信息。
可以在VBScript中完成吗?批次?
<?xml version="1.0" encoding="UTF-8"?>
<Print xmlns="http://stamps.com/xml/namespace/2009/8/Client/BatchProcessingV1">
<Configuration>
<MailingCutoffTime>00:00:00</MailingCutoffTime>
</Configuration>
<Layout>
<Desired>
<PaperID>1</PaperID>
</Desired>
</Layout>
<Item>
<BillingAddress>
<City>Anywhere</City>
<Country>United States</Country>
<OrderedEmailAddresses>
<Address>none@nomail.com</Address>
</OrderedEmailAddresses>
<LastName>Doe</LastName>
<MultilineAddress>
<Line>123 Any Ln</Line>
</MultilineAddress>
<OrderedPhoneNumbers>
<Number>555 555 4444</Number>
</OrderedPhoneNumbers>
<ZIP>12345</ZIP>
<State>KS</State>
</BillingAddress>
<HidePostageAmount>true</HidePostageAmount>
<Identity> [some number] </Identity>
<ShippingProfile>
<Identity> [some number] </Identity>
</ShippingProfile>
<MailClass>first class</MailClass>
<Mailpiece>package</Mailpiece>
<OrderContents>
<Item>
<ExternalID> [some number] </ExternalID>
<Name> [Item Title] </Name>
<Price>9.98</Price>
<Quantity>1</Quantity>
<Total>9.98</Total>
</Item>
<Item>
<ExternalID> [some number] </ExternalID>
<Name> [Item Title]</Name>
<Price>12.98</Price>
<Quantity>1</Quantity>
<Total>12.98</Total>
</Item>
</OrderContents>
<OrderDate>2014-03-12</OrderDate>
<OrderID> **[This is the ORDER ID I want to look for]** </OrderID>
<ShipMethod>ShippingMethodStandard</ShipMethod>
<Recipient>
<AddressFields>
<City>Anywhere</City>
<CleanseCode> [96-digit code that I have zero clue what it does, nor does Stamps.com tech support] </CleanseCode>
<Company></Company>
<Country>United States</Country>
<Department></Department>
<OrderedEmailAddresses>
<Address>ghost@nomail.com</Address>
</OrderedEmailAddresses>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
<MiddleName></MiddleName>
<MultilineAddress>
<Line>123 Any Ln</Line>
</MultilineAddress>
<NamePrefix></NamePrefix>
<NameSuffix></NameSuffix>
<OrderedPhoneNumbers>
<Number>555 555 4444</Number>
</OrderedPhoneNumbers>
<ZIP>12345-6789</ZIP>
<State>KS</State>
<Title></Title>
</AddressFields>
</Recipient>
<RecipientEmailOptions>
<ShipmentNotification>true</ShipmentNotification>
</RecipientEmailOptions>
<Sender>
<City>OurCity</City>
<LastName>OurCompany</LastName>
<MultilineAddress>
<Line>123 OurAddress</Line>
</MultilineAddress>
<OrderedPhoneNumbers>
<Number>800-Our-Fone</Number>
</OrderedPhoneNumbers>
<ZIP> [Our ZIP]</ZIP>
<State> [Our State] </State>
</Sender>
<Services>
<TrackingService>DeliveryConfirmation</TrackingService>
</Services>
</Item>
</Print>
基本上,这是与一批货物有关的所有信息的“块”。 “阻止”以<Item><BillingaAddress>
开头,以</TrackingService></Services></Item>
结尾。如果在该区域内,字段<OrderID> ORDER ID </OrderID>
匹配字符串,我需要清除整个块。
我已经格式化了上面的代码以便于阅读,但是在文件中根本没有标记之间的空格或空格。我认为它必须保持软件才能阅读它。
答案 0 :(得分:0)
@ECHO OFF
SETLOCAL
:: delete tempfiles
FOR /l %%z IN (1,1,3) DO DEL q22259592.%%z 2>nul
:: create sane file
(
FOR /f "delims=" %%a IN ('sed -e s/\x3E/\x3E\n/g -e s/\x3C/\n\x3C/g q22259592.txt') do echo(%%a
)>q22259592.1
:: find target line numbers
CALL :zapvars
FOR /f "tokens=1*delims=:" %%a IN ('findstr /n /r "$" q22259592.1') DO (
SET "line=%%b"
IF "%%b"=="<Item>" SET /a item=%%a
IF "%%b"=="<BillingAddress>" CALL :billing %%a
IF DEFINED oidb CALL :ordnum %%a
IF "%%b"=="</OrderID>" CALL :oide %%a
IF DEFINED se IF "%%b"=="</Item>" CALL :endb %%a
SET "se="
IF DEFINED tse IF "%%b"=="</Services>" SET /a se=%%a
SET "tse="
IF "%%b"=="</TrackingService>" SET /a tse=%%a
IF "%%b"=="<OrderID>" SET oidb=%%a
)
sed -f q22259592.2 q22259592.1|sed -e :a;N;$!ba;s/\n//g >q22259592.3
GOTO :EOF
:endb
IF DEFINED target >>q22259592.2 ECHO %itemb%,%1D
:zapvars
FOR %%z IN (itemb tse se target) DO SET "%%z="
GOTO :eof
:: BillingAddress line
:billing
SET /a result=%item%+1
:: If sequential Item and BillingAddress lines, new block
IF %result%==%1 CALL :zapvars&SET /a itemb=%item%
GOTO :eof
:: OrderID
:ordnum
SET "oidb="
FINDSTR /b /e /l /c:"%line%" q22259592.zap >NUL
IF ERRORLEVEL 1 (SET /a target=0) ELSE (SET /a target=1+%1)
GOTO :eof
:: /OrderID
:oide
:: Leave Target set only if /OrderID follows immediately
IF NOT "%target%"=="%1" SET "target="
GOTO :eof
我使用GNUSED和一个名为q22259592.txt
的文件进行测试。
首先在每个&gt; 和&lt; 之后插入换行符,然后从结果中删除所有空行并存入filename.1
下一步是读取结果文件,对每一行进行编号并记录重要行的行号 - 块的开头(itemb
)以及目标行是否包含{{1}中的一个字符串 - 要删除的项目文件。
在到达q22259592.zap
行时,如果找到了将删除从</Item>
到当前(SED
)行的行的目标,则会生成itemb
命令。
为了处理每一行,</Item>
使用SED
文件从.2
文件中删除相应的行,然后删除所有换行并生成.1
文件
...应该包含所需的数据。
当然,文件的名称并不重要。
文件.3
是一个简单的文本文件,其中包含要删除的OrderID列表,一行到一行。