双引号不会在循环中被转义

Double quotes are not being escaped in a loop

我有一个 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

我写了一个循环去每一行然后发现那里是否有双引号。我能够遍历每一行,但没有找到双引号。我也尝试过 findfindstr 命令。我尝试使用 \^" 作为双引号的转义字符,但没有任何效果。 下面是我的代码(双引号作为转义字符):

@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
)

请帮忙!

find command expects the second parameter to be a file path but not a literal string, so you cannot do find """" !line! to find a literal " in the string represented by !line!. To search a string you will have to use a pipe (|):

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

虽然 "" 对文字 " 的转义是正确的,但这是专门针对 find 命令的。


总之,可能不需要使用find 管道,这很慢,而且遇到特殊字符时可能会很麻烦。由于包含逗号或引号的字段应根据 [CSV 格式规范][fmtcsv] 引用,您可以只处理周围的引号,如以下示例所示。

如果没有字段为空(因此没有相邻的 , 出现)并且在包含 , 的第 7 个字段之前没有(引用的)字段,设置 tokensdelims for 元变量的 for /F loop to get the seventh field. Then you can make use of the ~-modifier 选项删除周围或前导 " 并将结果与​​普通元变量进行比较:

@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
)

(操作方法:将命令行参数(参数)传递给 Windows 批处理文件。) [fmtcsv]: https://www.rfc-editor.org/rfc/rfc4180 (逗号分隔值 (CSV) 文件的通用格式和 MIME 类型)