Используйте командный файл для замены (C *) в CSV-файле - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть CSV-файл с 18 полями.Четвертое поле включает несколько подстрок, которые я хотел бы удалить, включая (C: 1-0-1), (NET) и (MR).Следующее не работает, если подстрока содержит круглые скобки.Как я могу заставить этот пакетный файл удалить любую подстроку с подстановочным знаком (C *)?Я использовал «rem» для устранения неполадок, но окончательный пакетный файл необходимо удалить (C *), (NET) и (MR) из четвертого поля.

1,"MAY090178","D ","BATMAN HUSH COMPLETE TP (C: 1-1-0)",24.99,11.2455,11.25,3,7,         ,62464962,"76194127923700111","1401223176","978140122317552499","                    ",0,"DC COMICS",000000
1,"NOV141747","F ","BLACK BUTLER GN VOL 19 (C: 1-1-0)",13.00,7.5400,7.54,3,7,         ,62464962,"","0316259403","978031625940851300","                    ",0,"YEN PRESS",127143
2,"MAY151682","F ","BLACK BUTLER GN VOL 20 (C: 1-1-0)",13.00,7.5400,15.08,3,7,         ,62464962,"","0316305014","978031630501351300","                    ",0,"YEN PRESS",127143
1,"AUG180208","D ","BULLY WARS #2 CVR A CONLEY",3.99,1.7955,1.80,1,7,         ,62464962,"70985302666200211","","","                    ",0,"IMAGE COMICS",140749
1,"OCT180162","D ","BULLY WARS #4 CVR A CONLEY",3.99,1.7955,1.80,1,7,         ,62464962,"70985302666200411","","","                    ",0,"IMAGE COMICS",140749
10,"SUPPLY123","J ","COMICARE LONG COMIC BOX (SOLD IN 10) (NET)",2.53,2.5330,25.33,12,7,         ,62464962,"603259601235","","","                    ",0,"",000000

rem | Remove (C: 1-1-0) etc from titles
for /f "tokens=1,* delims=¶" %%A in ('"type     datatest_update.csv"') do (
    SET string=%%A
rem SET string2=%%A
rem SET string3=%%A
    setlocal EnableDelayedExpansion
    SET modified=!string:(C: 1-1-0) = !
rem SET modified2=!string:EXTRAS (NET) = !
rem SET modified3=!string:(MR) = !

    >> datatest_update_2.csv echo(!modified!
    endlocal
)

РЕДАКТИРОВАТЬ: я обновил файл до следующего, но он не запускается.Должен ли я использовать delims = вместо delims = ¶?

rem | Remove (C: 1-1-0) etc from titles
for /f "tokens=1,* delims=¶" %%A in ('"type datatest_update_6.csv"') do (
    SET string=%%A
    SET modified=!string: (C: 1-1-0)=!
    SET modified=!modified: (NET)=!
    SET modified=!modified: (MR)=!
    setlocal EnableDelayedExpansion
    >> datatest_update_7.csv echo(!modified!
    endlocal
) 

1 Ответ

0 голосов
/ 29 декабря 2018

Это можно сделать с помощью базовой функции замены.Первое, что нам нужно сделать, это поиск данных, которые содержат (C: 1-1-0) EX: "BATMAN HUSH COMPLETE TP (C: 1-1-0)".Отсюда мы можем установить это как "Replace this" в строке.Строка "search this" будет представлять собой все данные строки Raw.

Поскольку ваши данные находятся в четвертом столбце, мы можем использовать delims=, для сбора этих данных.После того, как мы находим эти данные внутри loop, мы можем вызвать функцию замены с помощью команды CALL.Функция «Заменить» будет редактировать только нужную ей строку, поэтому другие нетронутые данные останутся.

@ECHO OFF
@setlocal enabledelayedexpansion

Set "InputFile=File.csv"
Set "FindText=(C: 1-1-0)"

Rem | Expand Document To Loop
for /f "tokens=*" %%A in ('Type "%InputFile%"') do (

    Set "OriginalLine=%%A"
    Rem | Only Find The Parses Containing "(C:"
    for /f "tokens=1,2,3,4* delims=," %%B in ('Echo %%A^| find /I "%FindText%"') do (

        Rem | Remove The Proper String
        SET "RemoveMe=%%E"
        CALL :EditLine !RemoveMe!

    )
)

GOTO :EOF

:EditLine
REM | Change The %RemoveMe% To ""
Set ReplaceText=!OriginalLine:%1=""%!

REM | Make sure we only edit the ListOfItems line.
FOR /F "delims=" %%n IN ('findstr /n "^" %InputFile%') DO (
    SET line=%%n
    SET Modified=!line:%OriginalLine%=%ReplaceText%!
    SET Modified=!Modified:*:=!

    REM | Output the entire edited INI to a temporary file.
    >> %InputFile%.TEMP ECHO(!Modified!
)

Rem | Delete Original File, Restore New
DEL %InputFile%
REN %InputFile%.TEMP %InputFile%

GOTO :EOF

РЕДАКТИРОВАТЬ:

Исходя из неправильного понимания, яВы хотели полностью удалить все содержимое столбца, содержащего (C: 1-0-1).Сценарий исправит эту проблему и проблему с «подстановочными знаками».

Насколько я знаю, команда find не имеет расширяемых подстановочных знаков в пакете.Если я ошибаюсь по этому поводу, исправьте меня в комментариях.

Однако, чтобы преодолеть эту проблему, мы можем просто найти строки в документе, содержащем (C:, а затем в функции замены удалить последние 11 символовСтрока 4-го столбца.Используя оператор поиска, вы также можете ограничить свои результаты до примера: (C: 1-0 вместо (C: - Это не затронет ни одной строки с ex: (C: 1-2 в файле, но все 1-0-* будут изменены.

@ECHO OFF
@setlocal enabledelayedexpansion

Set "InputFile=File.csv"
Set "FindText=(C:"

Rem | Expand Document To Loop
for /f "tokens=*" %%A in ('Type "%InputFile%"') do (

    Set "OriginalLine=%%A"
    Rem | Only Find The Parses Containing "(C:"
    for /f "tokens=1,2,3,4* delims=," %%B in ('Echo %%A^| find /I "%FindText%"') do (

        Rem | Remove The Proper String
        SET "RemoveMe=%%E"
        CALL :EditLine !RemoveMe!

    )
)

GOTO :EOF

:EditLine
REM | Remove The %FindText% To Restore Later
REM | Since the find command has no wild cards we will remove it via "~0,-11%"
REM | This will remove the last 11 characters in the string
Set SaveMe=!RemoveMe:"=%!
Set "SaveMe=%SaveMe:~0,-11%"

REM | Change The %RemoveMe% To %SaveMe%
Set ReplaceText=!OriginalLine:%1="%SaveMe%"%!

REM | Make sure we only edit the ListOfItems line.
FOR /F "delims=" %%n IN ('findstr /n "^" %InputFile%') DO (
    SET line=%%n
    SET Modified=!line:%OriginalLine%=%ReplaceText%%!
    SET Modified=!Modified:*:=!

    REM | Output the entire edited INI to a temporary file.
    >> %InputFile%.TEMP ECHO(!Modified!
)

Rem | Delete Original File, Restore New
DEL %InputFile%
REN %InputFile%.TEMP %InputFile%

GOTO :EOF

Variation # 2 - Выберите строки для редактирования:

В этой версии я предоставлю возможность выбрать отдельные строки для редактирования, разрешив несколько строк поиска.Это также будет работать с «подстановочными знаками» ..

Пример: функция Call :FindText "(C: 1-1-0)" "(C: 1-1-2)" "(C: 1-2" удалит следующее из четвертого столбца в документе.

  • (C: 1-1-0) - удаление из существующего столбца.
  • (C: 1-1-2) - удаление из существующего столбца.
  • (C: 1-2 - удаление ALL 1-2-* из существующих столбцов.

BatchScript:

@ECHO OFF
@setlocal enabledelayedexpansion

Rem | Configuration
Rem | To use the command, Call :FindText "Desired Text One" "Desired Text Two" "exc..."
Set "InputFile=File.csv"
Call :FindText "(C: 1-1-0)" "(C: 1-1-2)" "(C: 1-1-3)"

pause
GOTO :EOF

Rem | Loop Through Each Search Results
:FindText
for %%A in (%*) do (

    Rem | Expand Document To Loop
    for /f "tokens=*" %%B in ('Type "%InputFile%"') do (

        Set "OriginalLine=%%B"
        Rem | Only Find The Parses Containing "(C:"
        for /f "tokens=1,2,3,4* delims=," %%C in ('Echo %%B^| find /I %%A') do (

            Rem | Remove The Proper String
            SET "RemoveMe=%%F"
            CALL :EditLine !RemoveMe!

        )
    )
)

GOTO :EOF

:EditLine
REM | Remove The %FindText% To Restore Later
REM | Since the find command has no wild cards we will remove it via "~0,-11%"
REM | This will remove the last 11 characters in the string
Set SaveMe=!RemoveMe:"=%!
Set "SaveMe=%SaveMe:~0,-11%"

REM | Change The %RemoveMe% To %SaveMe%
Set ReplaceText=!OriginalLine:%1="%SaveMe%"%!

REM | Make sure we only edit the ListOfItems line.
FOR /F "delims=" %%n IN ('findstr /n "^" %InputFile%') DO (
    SET line=%%n
    SET Modified=!line:%OriginalLine%=%ReplaceText%%!
    SET Modified=!Modified:*:=!

    REM | Output the entire edited INI to a temporary file.
    >> %InputFile%.TEMP ECHO(!Modified!
)

Rem | Delete Original File, Restore New
DEL %InputFile%
REN %InputFile%.TEMP %InputFile%

GOTO :EOF

Для получения справки по любой из команд выполните следующее:

  • call /?
  • set /?
  • for /?
  • if /?
  • find /?
  • и т. Д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...