Чтение командного файла Windows из файла без данных между разделителями

У меня есть многострочный CSV, который выглядит так:

A/B//D
E//G/H

Я пытаюсь использовать эти a, b, c (в данном случае пусто) и d в качестве входных параметров. Код, который у меня есть сегодня, пропускает C и назначает D на 3-ю позицию.

FOR /F " tokens=1,2,3,4 delims=/" %%i IN (MYCSV.txt"') DO tabcmd get "MyView.png?Filter1=%%A&Filter2=%%B&Filter3=%%C&Filter4=%%D" -f "Outputfile.png"

Ожидаемый результат:

Mview.png? Filter1 = A & Filter2 = B & Filter3 = & Filter4 = D

Что я получаю: Mview.png? Filter1 = A & Filter2 = B & Filter3 = D & Filter4 =

Любая помощь будет очень признательна. Спасибо.

Добро пожаловать в SO как новый пользователь. Пожалуйста, возьмите тур. Если вы прочитаете help for или посетите ss64.com/nt/for_f.html, вы поймете, что это нормальное поведение, поскольку / f игнорирует ведущие разделители и считает последовательные разделители только одним.

user6811411 09.08.2018 21:57

Dbenham сделал для этого хороший вспомогательный командный файл. dostips.com/forum/viewtopic.php?t=5702

Squashman 10.08.2018 05:09

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

Stephan 10.08.2018 11:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать PowerShell в качестве инструмента из пакета, в котором есть командлет Import-Csv. Требуется временное присвоение заголовков, которые можно удалить при сохранении. CSV на выходе будет иметь поля в двойных кавычках с выбранным вами разделителем.

powershell -Nop -C "(Import-Csv '.\mycsv.txt' -Delim '/' -Header (1..4))|ConvertTo-Csv -NoType|Select -Skip 1|Set-Content '.\my.csv'"

Пример вывода:

> type my.csv
"A","B","","D"
"E","","G","H"
Ответ принят как подходящий

for /F объединяет соседние разделители в один для синтаксического анализа текста. Однако вы можете прочитать целые строки, временно вставить символ без разделителя для разделения на токены и удалить его позже, например:

rem // Read whole lines:
for /F "usebackq delims = " %%A in ("MyCSV.txt") do (
    rem // Store current line:
    set "LINE=%%A"
    rem // Toggle delayed expansion to avoid trouble with `!`:
    setlocal EnableDelayedExpansion
    rem /* Prepend `_` to line string and replace every `/` by `/_`, hence every `/`-delimited
    rem    item becomes preceded by `_`, hence no more adjacent delimiters `/` can occur: */
    for /F "tokens=1-4 delims=/" %%a in ("_!LINE:/=/_!") do (
        endlocal
        rem // Get items preceded with `_`:
        set "ITEM1=%%a"
        set "ITEM2=%%b"
        set "ITEM3=%%c"
        set "ITEM4=%%d"
        setlocal EnableDelayedExpansion
        rem // Return rebuild line string with delimiters `,` and preceding `_` removed:
        echo(!ITEM1:~1!,!ITEM2:~1!,!ITEM3:~1!,!ITEM4:~1!
    )
    endlocal
)

Конечно, чтобы просто заменить символ-разделитель, вы можете просто сделать это:

rem // Read whole lines:
for /F "usebackq delims = " %%A in ("MyCSV.txt") do (
    rem // Store current line:
    set "LINE=%%A"
    rem // Toggle delayed expansion to avoid trouble with `!`:
    setlocal EnableDelayedExpansion
    rem // Return new line string with delimiters replaced:
    echo(!ITEM:/=,!
    endlocal
)

Спасибо что нашли время ответить. Это полезно, но не дает мне того, чего я хочу. Я хочу отделить эти 4 значения, чтобы я мог использовать их где-нибудь еще в процессе в качестве фильтров. Можно ли поместить эти значения в переменные, которые затем можно будет использовать в своих фильтрах? Моя проблема в том, что 4-й фильтр применяется к 3-му, поскольку 3-я пустая строка, а командный файл ее игнорирует.

Dhruv Malik 10.08.2018 17:34

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

aschipfl 10.08.2018 20:22

извините, я не успел увидеть это раньше, когда ехал за город. Итак, я попробовал ваш сценарий, и он делает именно то, что я хочу. НО! Теперь он не признает мое «Заявление о делах». Как будто я использую этот Tabcmd для просмотра ссылки и применения к ней моих фильтров, но он не работает в части tabcmd. Может быть, потому, что я заставляю его делать две вещи в одном блоке For. tabcmd get "tableauView.png? Filter1 =! ITEM1: ~ 1! & Filter2 =! ITEM2: ~ 1! & Filte‌ r3 =! ITEM3: ~ 1! & Filter‌ 4 =! ITEM4: ~ 1!" -f "\\ SavedFile-! ITEM1: ~ 1!,. png") endlocal)

Dhruv Malik 15.08.2018 00:31

Возможно, вам следует включить в свой вопрос предполагаемую командную строку tabcmd; в данный момент я не могу следить, извините ...

aschipfl 15.08.2018 12:24

да, я думаю, я не правильно задал вопрос. Позвольте мне перефразировать вопрос. Мне жаль, что я вас запутала. Тем не менее, спасибо за помощь.

Dhruv Malik 15.08.2018 17:18

Я все еще не понимаю, в чем проблема. Не могли бы вы указать tabcmd перед командной строкой echo и проверить правильность вывода?

aschipfl 15.08.2018 20:42

Если я использую предложенный вами код и вставляю код tabcmd вместо последнего эха, код завершается ошибкой, что tabcmd не является распознанной командой. Однако я использовал tabcmd в других кодах внутри циклов for. Как вы думаете, одно предложение Do в цикле может выполнять только одно действие? И в этом случае он присваивает значения элементам. Извините, я очень прост, когда дело доходит до cmd.

Dhruv Malik 15.08.2018 21:35

Хорошо, я не знаю, что такое tabcmd, но его невозможно найти, поэтому попробуйте указать его полный путь, например. g., "C:\some\directory\tabcmd" ...; Я могу сказать вам, что это определенно не имеет ничего общего с предложением do цикла for ...

aschipfl 15.08.2018 21:49

хорошо, так что ваше решение сработало. Я делал что-то еще не так, чтобы tabcmd вылетел. Большое спасибо за вашу помощь. Ценить это.

Dhruv Malik 16.08.2018 17:05

Другие вопросы по теме