Сравнение внутри цикла FOR - PullRequest
3 голосов
/ 28 марта 2019

Я пытаюсь прочитать список значений / строк (они варьируются между буквами и цифрами) из текстового файла, если значение / строка существует в выходном текстовом файле, ничего не делать, иначе добавьте его в текстовый файл.

Я потратил более 3 дней на исследования и пробовал разные вещи и идеи.В процессе поиска я наткнулся на сообщение, очень похожее (ссылка ниже) на то, что мне нужно сделать, но, поскольку я новичок в программировании и буквально мне некого просить о помощи, я надеюсь, что вы, ребята, сможете мне помочь.

Сравнение строк в пакете внутри оператора for (if))

Так что использовали что-то очень похожее на пост выше, но я не знаю, я простоустал или я просто слеп, чтобы понять, где я делаю что-то не так.

@echo off
set ProjectNo=12345
set ProjectLocation=X:\Projects\123 ABC\45 WALL\G Drafting 12345\02 Models
set location=X:\Scripts
set areas=%location%\%ProjectNo%-AREAS.txt
set MAT=%location%\%ProjectNo%-MAT.txt

setlocal enableextensions enabledelayedexpansion


for /F %%a in ("%areas%") do (
    set "MA=%%a"
    setlocal EnableDelayedExpansion
    echo(!MA!
    pause
    if exist "!MA!"=="!MA:%MA%=!" (
        echo matched
        > nul
        ) else ( 
        echo nomatch
        > %MAT%
        )
        endlocal
    )
)

endlocal
pause 

Содержимое 12345-AREAS.txt выглядит следующим образом (текущий):

01 
01 
10 
10 
10 
10 
130 
15 
15 
15
20 
20 
20 
20
25 
25 
25
30 
30 
30 
30 

Этосписок может варьироваться от 10 до 300 значений (сильно варьируется)

То, что я стремлюсь получить в выходном файле, 12345-MAT.txt - это одно и уникальное значение каждого из них, например:

01
10
130
15
20
25
30

Ответы [ 2 ]

3 голосов
/ 29 марта 2019

Вот простой подход, который сортирует текстовые данные, читает текст построчно, сравнивает каждую строку с предыдущей и возвращает текущую только в случае несоответствия:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Reset buffer for previous line:
set "PREV="
rem // Write to output file:
> "12345-MAT.txt" (
    rem // Read lines from input file:
    for /F delims^=^ eol^= %%L in ('sort "12345-AREAS.txt"') do (
        rem // Store current line:
        set "LINE=%%L"
        rem // Toggle delayed expansion to not lose `!`-signs:
        setlocal EnableDelayedExpansion
        rem // Compare current line with previous one:
        if not "!LINE!"=="!PREV!" echo(!LINE!
        endlocal
        rem // Store line for next loop iteration:
        set "PREV=%%L"
    )
)

endlocal
exit /B

Преимущество этого метода в том, что могут встречаться все символы; недостатком может быть скромная производительность.

3 голосов
/ 28 марта 2019

Итак, вы после уникальной сортировки.

Здесь вариант, который не нуждается в отложенном расширении,
, устанавливая env vars с элементами, заключенными в _[]

@echo off
set "ProjectNo=12345"
set "ProjectLocation=X:\Projects\123 ABC\45 WALL\G Drafting 12345\02 Models"
set "location=X:\Scripts"
set "areas=%location%\%ProjectNo%-AREAS.txt"
set "MAT=%location%\%ProjectNo%-MAT.txt"

Setlocal
:: clear env vars _[
for /f "delims=" %%A in ('set _[ 2^>Nul') Do set "%%A="

(for /f %%A in ('sort ^<"%areas%"')  Do if not defined _[%%A] (
    set "_[%%A]=1"
    Echo:%%A
  )
) > "%MAT%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...