如何通过批量删除文本文件的重复部分?

问题描述 投票:0回答:1

所以目前我必须运行 CLI 命令来生成文件夹中所有播放列表的数据,输出文本文件如下所示。

********************
PLAYLIST: 1
********************

<--- BEGIN FORUMS PASTE --->

Some unnecessary Data
Some unnecessary Data
Some unnecessary Data
......

<---- END FORUMS PASTE ---->

QUICK SUMMARY:

********************
PLAYLIST: 2
********************

<--- BEGIN FORUMS PASTE --->

Some unnecessary Data
Some unnecessary Data
Some unnecessary Data
.....

<---- END FORUMS PASTE ---->

QUICK SUMMARY:

********************
PLAYLIST: 3
********************

<--- BEGIN FORUMS PASTE --->

Some unnecessary Data
Some unnecessary Data
Some unnecessary Data
.....

<---- END FORUMS PASTE ---->

QUICK SUMMARY:
Required Data

据我所知,批处理文件无法在原始文件上删除它,但可以使用处理后的数据创建一个新文件,这对我来说很好。

现在我想要实现的是输出文本文件中的所有播放列表都有重复出现的部分。这些是以

<--- BEGIN FORUMS PASTE --->
开头并以
<---- END FORUMS PASTE ---->
结尾的部分。因此,我试图删除以它们开头和结尾的每个部分,基本上省略了该部分中未包含的所有数据。

我不知道该怎么做,但我觉得

findstr
命令将在这里使用,或者可能是 VBscript。

windows batch-file cmd
1个回答
0
投票

可以使用以下批处理文件完成该任务:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Remove all environment variables defined by default for faster lines
rem processing with exception of the environment variable ComSpec, Path,
rem PATHEXT and SystemRoot. The last one is really used below.
for /F "delims==" %%I in ('set ^| %SystemRoot%\System32\findstr.exe /B /I /L /V "Comspec Path PATHEXT SystemRoot"') do set "%%I="

set "SourceFile=PlayList.txt"
if not exist "%SourceFile%" (
    echo ERROR: File not found: "%SourceFile%"
    echo(
    pause
    goto EndBatch
)

set "EmptyLine="
set "IgnoreLines="
set "FileModified="
set "TempFile=%SourceFile%.tmp"

(for /F delims^=^ eol^= %%I in ('%SystemRoot%\System32\findstr.exe /N "^" "%SourceFile%" 2^>nul') do (
    set "Line=%%I"
    setlocal EnableDelayedExpansion
    if not defined IgnoreLines (
        if "!Line:<--- BEGIN FORUMS PASTE --->=!" == "!Line!" (
            if "!Line:*:=!" == "" (
                if not "!EmptyLine!" == "2" echo(
                endlocal
                set "EmptyLine=1"
            ) else (
                echo(!Line:*:=!
                endlocal
                set "EmptyLine="
            )
        ) else (
            endlocal
            set "IgnoreLines=1"
            set "FileModified=1"
        )
    ) else (
        if "!Line:<---- END FORUMS PASTE ---->=!" == "!Line!" (
            endlocal
        ) else (
            endlocal
            set "IgnoreLines="
            if defined EmptyLine set "EmptyLine=2"
        )
    )
))>"%TempFile%"

if defined FileModified move /Y "%TempFile%" "%SourceFile%" >nul
if exist "%TempFile%" del "%TempFile%"

:EndBatch
rem Restore the initial execution environment with the initial variables list.
endlocal

请阅读我的答案如何逐行读取和打印文本文件的内容?它解释了为什么使用FINDSTR以及为什么使用如此困难的代码来处理文本文件的行与FOR Windows 命令处理器

cmd.exe
根本不是为文本文件修改而设计的。

批处理文件设计为如果包含

<---- END FORUMS PASTE ---->
的行上方有一个空行,也会忽略包含
<--- BEGIN FORUMS PASTE --->
的行下方的第一个空行,以避免在删除的块上的文件中最终出现两个空行。

示例:源文件包含以下行:

********************
PLAYLIST: 1
********************
    <--- BEGIN FORUMS PASTE --->

Some unnecessary Data
Some unnecessary Data
Some unnecessary Data
......

    <---- END FORUMS PASTE ---->

QUICK SUMMARY:

********************
PLAYLIST: 2
********************
BEGINNING LIST 2 <--- BEGIN FORUMS PASTE --->

Some unnecessary Data
Some unnecessary Data
Some unnecessary Data
.....

<---- END FORUMS PASTE ----> END LIST 2
QUICK SUMMARY:

********************
PLAYLIST: 3
********************

<--- BEGIN FORUMS PASTE --->

Some unnecessary Data
Some unnecessary Data
Some unnecessary Data
.....

<---- END FORUMS PASTE ---->

QUICK SUMMARY:
Required Data

该源文件被批处理文件修改为:

********************
PLAYLIST: 1
********************

QUICK SUMMARY:

********************
PLAYLIST: 2
********************
QUICK SUMMARY:

********************
PLAYLIST: 3
********************

QUICK SUMMARY:
Required Data

<--- BEGIN FORUMS PASTE --->
<---- END FORUMS PASTE ---->
周围的前导或尾随空格/制表符或其他字符对于识别要从源文件中删除的块的开头和结尾并不重要。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。

  • del /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • move /?
  • pause /?
  • rem /?
  • set /?
  • setlocal /?
© www.soinside.com 2019 - 2024. All rights reserved.