Двойные кавычки не экранируются в цикле - PullRequest
0 голосов
/ 26 мая 2020

У меня есть файл csv (например, test.csv), и мне нужно найти строки с двойными кавычками только в этом файле. Эти строки в двойных кавычках должны находиться в одном конкретном столбце (например, в 7-м столбце). Ниже приводится содержимое файла:

Company,Project Code,Level 1,New Level 2,New Level 3,Task Number,Level 4 Description,Year,Period,Currency,Cost
WHITE ENGINEERING AND TECHNOLOGY,123456,A,A- AB,A-AB-ABC,A-AB-ABC-XYZ,"Hello , World",2020,February,AAA,9900000
WHITE ENGINEERING AND TECHNOLOGY,123456,A,A- AB,A-AB-ABC,A-AB-ABC-XYZ,"My , World",2020,February,AAA,9900001
WHITE ENGINEERING AND TECHNOLOGY,123456,A,A- AB,A-AB-ABC,A-AB-ABC-XYZ,"Your , World",2020,February,AAA,9900002

Я написал от al oop до go в каждой строке, а затем обнаружите, что если там есть двойные кавычки. Я могу l oop по каждой строке, но двойные кавычки не обнаруживаются. Я также пробовал использовать команды find и findstr. Я пробовал использовать \, ^ и " в качестве escape-символов для двойных кавычек, но ничего не работает. Ниже мой код (с двойной кавычкой в ​​качестве escape-символа):

@echo off
setLocal EnableDelayedExpansion

FOR /F "tokens=* delims=" %%a IN (test.csv) DO (
    set line=%%a
    echo !line!
    find """" !line! && (
                echo "Double quotes found"
                ) || (
                echo "Double quotes not found"
                )
    pause
)

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 26 мая 2020

Команда find ожидает, что второй параметр будет путь к файлу, а не буквальная строка, поэтому вы не можете сделать find """" !line!, чтобы найти литерал " в строке, представленной !line!. Для поиска строки вам нужно будет использовать канал (|) :

echo(!line!| find """" && (echo Found quotes.) || (echo No quotes found.)

Экранирование литерала " на "" является правильным, но это специально для команды find.


В любом случае, возможно, нет необходимости использовать find с конвейером, что довольно медленно и может вызвать проблемы, когда дело доходит до специальных символов. Поскольку поля, содержащие запятые или кавычки, должны быть заключены в кавычки в соответствии со спецификацией формата CSV , вы можете просто позаботиться об окружающих кавычках, как в следующем примере.

Если ни одно поле не пустое ( поэтому рядом не появляется ,) и перед 7-м полем, содержащим ,, нет поля (в кавычках), установите параметры tokens и delims для for /F l oop чтобы получить седьмое поле. Затем вы можете использовать ~ -модификатор метапеременной for, чтобы удалить окружающие или ведущие " и сравнить результат с простой метапеременной:

@echo off
for /F "usebackq tokens=7 delims=, eol=," %%a in ("test.csv") do (
    if not "%%~a"=="%%a" echo The 7th field is quoted: %%a
)
...