使用基于值的批处理文件从文本文件中删除回车 returns

Removing carriage returns from a text file using a batch file based on a value

我有一个要编辑的文本文件,因此我想删除最后一行。为此,我有以下代码:

for /f "delims=" %%a in (input.txt) do (
echo/|set /p ="%%a%"
)>>output.txt

输入:

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;

输出:

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;

现在我想按第一个值分组编辑数据,以便得到以下输出:

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;

如果我用等效的 FOR %%a in … loop:

替换 FOR /F "delims=" %%a in (input.txt) do … 循环
@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
set "_gruppeName="
(
  for %%a in (
    "GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
    "GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;"
  ) do (
    for /f "tokens=1 delims=;" %%A in ("%%~a") do (
      if /I NOT "%%~A"=="!_gruppeName!" (
        if defined _gruppeName echo(
        set "_gruppeName=%%~A"
      )
    ) 
    echo/|set /p ="%%~a"
  )
  echo(
)>>output.txt
REM debugging output follows
type output.txt

输出:

第一 运行: 2>NUL del output.txt & D:\bat\CR816520.bat

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;

下一个运行D:\bat\CR816520.bat

GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEA;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEB;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;
GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;GRUPPEC;123;12345;sdfdsfds;sdfdsfsdfs;sdfsdfafsf;

你的问题不清楚

based on ... the first value (GRUPPEA)

SORT编辑的吗?或者只是在同一行上重复写?

@echo off
SETLOCAL EnableExtensions EnableDelayedExpansion

::VARIABLES
set "in=input.txt" IN file
set "out=output.txt" OUT file

set/a"#lines=0"
set "gruppe="
set "prevContent="

::Count lines
FOR /F %%L in ('
"findstr /N "^^" "%in%" %= do not skip empty lines =%"
') do set/a"#lines+=1" %= Get the # of lines =%


::Read IN via SET /P #LINES number of times
::Bangs (!) will be lost
<"%in%" >"%out%" (FOR /L %%# in (1 1 %#lines%) do (
    set "data="                           ::clear DATA
    set/p"data="                          ::read from IN
    FOR /F tokens^=1^ delims^=^;^ eol^= %%T in ("!data!") do set "gruppe=%%T"
    if NOT "!prevContent!" == "!gruppe!" (
        set "prevContent=!gruppe!"
        echo(
    )
    <nul set/p"=!data!"                    ::does not work with leading space, tabs, or equal signs
)) %= read file by lines via SET /P =%

exit /b

脚本使用 FINDSTR /N and a FOR /F 循环来计算行数,这是执行 SET /P 多次所需的行数。

提示:

  • 使用ECHO(代替有问题的ECHO.
  • 使用管道 | 非常慢,如 @jeb here 所述。使用 <nul 代替