双引号不会在循环中被转义
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
我写了一个循环去每一行然后发现那里是否有双引号。我能够遍历每一行,但没有找到双引号。我也尝试过 find
和 findstr
命令。我尝试使用 \
、^
和 "
作为双引号的转义字符,但没有任何效果。
下面是我的代码(双引号作为转义字符):
@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 个字段之前没有(引用的)字段,设置 tokens
和 delims
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 类型)
我有一个 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
我写了一个循环去每一行然后发现那里是否有双引号。我能够遍历每一行,但没有找到双引号。我也尝试过 find
和 findstr
命令。我尝试使用 \
、^
和 "
作为双引号的转义字符,但没有任何效果。
下面是我的代码(双引号作为转义字符):
@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 个字段之前没有(引用的)字段,设置 tokens
和 delims
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 类型)