Заменить определенный текст в каждой строке из текстового файла, используя командный файл - PullRequest
0 голосов
/ 26 июня 2019

У меня есть текстовый файл. Я хочу удалить все конечные 0 в каждой строке до строки № 19, используя пакетный скрипт

Я написал код для поиска конкретной строки. И не знаю, как двигаться вперед

Я хочу, чтобы текстовый файл был изменен без окончания 0 в каждой строке

файл novamth.txt

ATC4            C   5   0
CTY         C   3   0
CTY_DESCR           C   21  0
E_DT_PRTEXP         C   43  0
E_YR_PRTEXP         C   41  0
GEN_PRD         C   28  0
LNCH_STATUS         C   22  0
MNF         C   18  0
NAME_TYPE           C   22  0
NFC123          C   3   0
PRD         C   18  0
PRE_PST_EXP         C   28  0
PROT_ECTION         C   24  0
REL_PROT_EXP_MTH            C   40  0
REL_PROT_EXP_YR         C   31  0
STR         C   6   0
INTSTR          C   52  0
PCK         C   31  0
INTPCK          C   72  0
    KG  MTH_04_2017 N   35  15
    KG  MTH_05_2017 N   35  15
    KG  MTH_06_2017 N   35  15
    KG  MTH_07_2017 N   35  15
    KG  MTH_08_2017 N   35  15

bat файл для поиска конкретной строки

@echo off & setlocal EnableDelayedExpansion
set LineNumber=19
set FileName=C:\PADDS\bat\nova\novamth.txt
set counter=0

for /F "delims=" %%j in ('type "%FileName%"') do (
  set /A counter+=1
  if !counter! equ %LineNumber% (echo.%%j> "myline.txt" & goto :END)
)
:END

1 Ответ

1 голос
/ 26 июня 2019

В зависимости от ваших потребностей у вас есть несколько вариантов, но давайте просто обратимся к основам, которые вы уже изложили, поскольку у вас почти есть рабочая версия!

Я собираюсь обернуть ваши наборы ", поэтому мыне заканчивайте никакими ошибочными символами в них.

 @(
    SetLocal EnableDelayedExpansion
    Echo off
 )
 set "LineNumber=19"
 set "FileName=C:\PADDS\bat\nova\novamth.txt"
 set "counter=1"

 For /F "tokens=*" %%j in ('type "%FileName%"') do (
    Set /A "counter+=1"
    Set "_Line=%%j"
    IF /I !counter! leq %LineNumber% (
       Set "_Line=!_Line:~0,-1!"
    )
    echo(!_Line!>> "myline.txt" 
 )

 :END
 (
    EndLocal
    Exit /B
  )

Я сохраняю строку во временной переменной _Line и удаляю THE LAST CHARACTER из этой строки, поскольку кажется, что у вас нет никакихзавершающие пробелы - это самый простой метод. Это изменение происходит только в первых 19 строках, после чего мы просто записываем его как есть.

>> используется для добавления в файл, так как > будетперезаписывать каждый раз, когда пишется строка.

В вышеприведенной версии, которая будет работать с предоставленными данными, это удалит ВСЕ 0. Это можно изменить, если 0 может появиться в местах, отличных от последнего битаЯ писал это на мобильном телефоне в душе и думал, что я отредактировал, чтобы включить эту информацию, но ее там не было, так что теперь это должно помочь:)

В любом случае, если у вас есть даТо, что МОЖЕТ иметь 0, можем ли мы хотя бы предположить, что всегда будет 4 члена?

Кроме того, есть ли когда-либо завершающие пробелы, которые выглядят как нет, поэтому я буду считать, что?

нужно сохранить все пробелы?(Я приду да) Даже те, которые предшествуют этому последнему 0?(Я пока предположу, что да, но было бы легко удалить их, как вы увидите)

Я приму ответы, как указано выше при написании следующей итерации.

Я исправил это далее, чтобы обеспечить явный вывод файла, созданного для проверки автором, так как Автор не смог его найти.

Я также слегка изменил переменные при добавлении переменной пути дляавтор для редактирования.

Также я решил добавить его, он удаляет выходной файл, если он уже существует, хотя специально не просил, если автор уже запустил это раньше.

REM Script: %~f0
REM Version: 1.0.0
@(
    SetLocal EnableDelayedExpansion
    Echo off
)
SET "_LineNumber=19"
SET "_SourceFileName=C:\PADDS\bat\nova\novamth.txt"
SET "_OutputFileName=C:\PADDS\bat\nova\myline.txt"
SET "_Counter=1"

DEL /F /Q "%_OutputFileName%"

For /F "tokens=*" %%j in ('type "%_SourceFileName%"') do (
    SET /A "_Counter+=1"
    SET "_Line=%%j"
    IF /I !_Counter! leq %_LineNumber% (
        FOR /F "Tokens=1-3 Delims=ABCDEFGHIJKLMNOPQRSTUVWXYZ_012345678910" %%J IN ("%%j") DO @(
            SET "_Space_1=%%J"
            SET "_Space_2=%%K"
            SET "_Space_3=%%L"
        )
        FOR /F "Tokens=1-3 Delims= " %%J IN ("%%j") DO @(
            SET "_Line=%%J!_Space_1!%%K!_Space_2!%%L!_Space_3!"
        )
    )
    echo(!_Line!>>"%_OutputFileName%"
)

(
    ECHO. Check the File "%_OutputFileName%"
    EndLocal
    Exit /B
)

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

Это позволяет нам фиксировать все пробелы, найденные между каждым членом, в некоторые переменные.

The For LooПосле этого p берет сами термины и повторно использует переменные цикла for, поскольку они уничтожаются один раз из предыдущего цикла.

Здесь нам не нужно присваивать какие-либо переменные, кроме переменной _Line, поскольку мы собралився информация нам нужна.поэтому мы используем термины, которые содержат данные, и разделяем их с помощью переменных Spaces, найденных на предыдущем шаге.

После того, как мы создали новую переменную LINE, мы закончили с нашим оператором If, а теперь нетнужно иметь отдельные операторы ECHO (честно говоря, даже в первом случае их не было, но я быстро писал их на мобильном телефоне, и мне казалось, что проще не сокращать их.

(я изменил оригинал нау меня также нет отдельного отклика, я всегда предпочитаю это, где это возможно, так как я чувствую, что это чище.)

Я исправил это, чтобы указать конкретный путь вывода для вашего файла в переменной, которую вы можете редактировать, и чтобыукажите этот путь в строке CMD.

Пример запуска сценария CMD в CLI:

Y:\>C:\PADDS\bat\nova\testnovamth.cmd

Y:\>REM Script: C:\PADDS\bat\nova\testnovamth.cmd

Y:\>REM Version: 1.0.0
 Check the File "C:\PADDS\bat\nova\myline.txt"

Y:\>

Пример вывода из сценария:

ATC4            C   5   
CTY         C   3   
CTY_DESCR           C   21  
E_DT_PRTEXP         C   43  
E_YR_PRTEXP         C   41  
GEN_PRD         C   28  
LNCH_STATUS         C   22  
MNF         C   18  
NAME_TYPE           C   22  
NFC123          C   3   
PRD         C   18  
PRE_PST_EXP         C   28  
PROT_ECTION         C   24  
REL_PROT_EXP_MTH            C   40  
REL_PROT_EXP_YR         C   31  
STR         C   6   
INTSTR          C   52  
PCK         C   31  
INTPCK          C   72  0
KG  MTH_04_2017 N   35  15
KG  MTH_05_2017 N   35  15
KG  MTH_06_2017 N   35  15
KG  MTH_07_2017 N   35  15
KG  MTH_08_2017 N   35  15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...