Windows批处理:替换CSV文件中的子字符串

Windows批处理:替换CSV文件中的子字符串,csv,batch-file,replace,Csv,Batch File,Replace,这是一个在网络上很流行的主题,但我找不到一个简单的方法在CSV文件中查找和替换。我的CSV文件如下所示: "0.219530613504834,43.7737904197643,PR RUE D'ARTOIS" "0.522235882011867,41.7681203998576,PR DE LA FOSSE AU ROI" "0.039404145384227,44.7565229712732,PR DES PETITS PRES" 我需要删除每行开头和结尾的双引号 我尝试了以下脚本: s

这是一个在网络上很流行的主题,但我找不到一个简单的方法在CSV文件中查找和替换。我的CSV文件如下所示:

"0.219530613504834,43.7737904197643,PR RUE D'ARTOIS"
"0.522235882011867,41.7681203998576,PR DE LA FOSSE AU ROI"
"0.039404145384227,44.7565229712732,PR DES PETITS PRES"
我需要删除每行开头和结尾的双引号

我尝试了以下脚本:

setlocal enabledelayedexpansion

for /f "tokens=*" %%a in (D:/data.csv) do (
    set temp=%%a
    set temp=%temp:^"=%
)
我的逻辑是将每一行存储在
%%a
中,并用零替换双引号

我用^避开双引号


这个脚本什么也没做。您能帮忙吗?

您的尝试有几个问题:

  • 您需要使用延迟扩展(使用
    而不是
    %
    )。如果没有延迟展开,变量将在进入循环之前展开

  • 使用
    “delims=“
    ”令牌=*”
    更可靠。使用
    “tokens=*”
    时,每一行仍然被标记化,然后所有的标记都被一个空格分隔。但是令牌可能最初由
    分隔。因此,如果输入中有“1;2”,那么输出中就会有“1;2”

  • 您不需要退出

  • 您需要打印
    temp
    ,而不仅仅是在不使用新值的情况下修改它

    setlocal enabledelayedexpansion
    
    for /f "delims=" %%a in (D:/data.csv) do (
        set temp=%%a
        echo !temp:"=!
    )
    

  • 您的尝试有几个问题:

  • 您需要使用延迟扩展(使用
    而不是
    %
    )。如果没有延迟扩展,变量将在进入循环之前展开

  • 使用
    “delims=”
    比使用
    “tokens=*”
    更可靠。使用
    “tokens=*”
    时,每一行仍然被标记化,然后所有的标记都被一个空格连接起来。但是这些标记最初可能被一个
    分隔。因此,如果您有一个;输入中的“2”,输出中的“1 2”

  • 您不需要退出

  • 您需要打印
    temp
    ,而不仅仅是在不使用新值的情况下修改它

    setlocal enabledelayedexpansion
    
    for /f "delims=" %%a in (D:/data.csv) do (
        set temp=%%a
        echo !temp:"=!
    )
    

  • 有一个更简单的解决方案可以避免延迟的扩展altogther,
    ~
    修改器条带包含变量内容的引号

    for /f "delims=" %%a in (D:/data.csv) do echo %%~a
    

    有一个更简单的解决方案可以避免延迟的扩展altogther,
    ~
    修改器条带包含变量内容的引号

    for /f "delims=" %%a in (D:/data.csv) do echo %%~a
    

    谢谢但我的文件仍然包含双引号。在cmd窗口中,我可以控制
    temp
    在没有双引号的情况下正确回显,但文件不会更改(不会从中删除双引号)。这不会对文件进行就地修改。它产生新的输出,保持输入不变。您可以使用`>newfile`通过管道输出批处理脚本,然后检查newfile的内容,如果您需要的话,可以替换旧文件。谢谢,这正是我所想的。我只是想确保不可能直接在输入中执行。你是对的,很多人在真正应该使用
    “delims=“
    ”时使用
    “tokens=*”
    。但是您的解释是错误的-
    tokens=*
    没有标记整个行。它只是从行中去掉前导分隔符,剩下的就不用管了。谢谢!但我的文件仍然包含双引号。在cmd窗口中,我可以控制
    temp
    在没有双引号的情况下正确回显,但文件不会更改(不会从中删除双引号)。这不会对文件进行就地修改。它产生新的输出,保持输入不变。您可以使用`>newfile`通过管道输出批处理脚本,然后检查newfile的内容,如果您需要的话,可以替换旧文件。谢谢,这正是我所想的。我只是想确保不可能直接在输入中执行。你是对的,很多人在真正应该使用
    “delims=“
    ”时使用
    “tokens=*”
    。但是您的解释是错误的-
    tokens=*
    没有标记整个行。它只是从行中去掉前导分隔符,剩下的就不用管了。干得好!这项工作做得很好。。。但是,我更喜欢@Klitos Kyriacou的答案,因为我的行中也有一些双引号,我需要去掉它们。@wiltomap-小心从CSV文件中删除其他引号-它们可能很重要。好的@dbenham,谢谢你的警告!无论如何,我的CSV文件非常简单,我相信我可以安全地删除这些字符。干得好!这项工作做得很好。。。但是,我更喜欢@Klitos Kyriacou的答案,因为我的行中也有一些双引号,我需要去掉它们。@wiltomap-小心从CSV文件中删除其他引号-它们可能很重要。好的@dbenham,谢谢你的警告!无论如何,我的CSV文件非常简单,我相信我可以安全地删除这些字符。