用于查找带换行符的替换字符串的批处理命令

时间:2016-12-03 23:20:40

标签: batch-file command-line

我的数据主要以我可以转换并导入电子表格的方式进行组织。但某些行具有回车符和当前批处理文件不会使用的文本。

好数据:

Pipers Cove × 2   $25.00
Pipers Cove Petite × 2    $25.00
Pipers Cove Plus × 2  $25.00
Nordic Club × 2   $25.00
Whiteout × 1  $12.50

错误数据:

Pipers Cove Kids × 2
Size:
Large - ages 10 to 12
$20.00
Pipers Cove Kids × 2
Size:
Medium - ages 6 to 8
$20.00
Pipers Cove Kids × 2
Size:
Small - ages 2 to 4
$20.00

我需要删除以SizeSmallMediumLarge开头的2行,并且美元金额会跟随数量编号,因此我的批处理文件可以将其转换为CSV文件,依此类推。

2 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q40953616.txt"
SET "outfile=%destdir%\outfile.txt"
SET "part1="
(
FOR /f "usebackqdelims=" %%i IN ("%filename1%") DO (
 ECHO %%i|FIND "$" >NUL
 IF ERRORLEVEL 1 (
  REM $ not found - set part1 on first such line
  IF NOT DEFINED part1 SET "part1=%%i"
  ) ELSE (
  REM $ found - see whether at start or not
  FOR /f "tokens=1*delims=$" %%a IN ("%%i") DO (
   IF "%%b"=="" (
    REM at start - combine and output and reset part1
    CALL ECHO %%part1%% %%i
    SET "part1="
   ) ELSE (
    ECHO %%i
   )
  )
 )
)
)>"%outfile%"

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。

我使用了一个名为q40953616.txt的文件,其中包含我的测试数据。

生成定义为%outfile%

的文件

扫描文件的每一行。如果该行不包含$,则将第一行保存在part1中 否则,标记该行。如果只有1个令牌,则$位于该行的开头,因此需要与part1组合输出 否则,只是回流线。

答案 1 :(得分:0)

虽然你没有表现出任何自己的努力,但我决定提供一个解决方案,因为手头的任务对我来说并不是那么微不足道。

以下脚本 - 我们称之为clean-up-text-file.bat - 只忽略以您指定的单词开头的行。任何其他行都会附加到前一行,直到遇到$符号,在这种情况下会启动新的ine。使用这种方法,任何行都不会无意中丢失。

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set _WORDS="Size","Small","Medium","Large"

for %%F in (%*) do (
    set "COLL=" & set "FILE=%%~F"
    for /F delims^=^ eol^= %%L in ('type "%%~F" ^& ^> "%%~F" rem/') do (
        set "LINE=%%L"
        (echo("%%L" | > nul find "$") && (
            setlocal EnableDelayedExpansion
            >> "!FILE!" echo(!COLL!!LINE!
            endlocal
            set "COLL="
        ) || (
            set "FLAG="
            for %%K in (%_WORDS%) do (
                (echo("%%L" | > nul findstr /I /R /B /C:^^^"\"%%~K\>") && (
                    set "FLAG=#"
                )
            )
            if not defined FLAG (
                setlocal EnableDelayedExpansion
                rem // The following line contains a TAB character!
                for /F "delims=" %%E in (^""!COLL!!LINE!    "^") do (
                    endlocal
                    set "COLL=%%~E"
                )
            )
        )
    )
)

endlocal
exit /B

要使用该脚本,请将您的文本文件提供为(a)命令行参数:

clean-up-text-file.bat "good.txt" "bad.txt"

每个指定的文件都是直接修改的,所以在测试时要小心!