首页 > 解决方案 > 需要使用批处理脚本替换 CSV 文件中的特定文本

问题描述

我想替换特定列中 CSV 文件中的特定文本。我可以使用旧帖子来做到这一点。但是当我的 CSV 数据包含空间时,该代码不起作用。我不是批处理脚本专家,所以我无法修复它。我尝试了很多东西。

@echo off
setlocal enabledelayedexpansion
set inputCSV=TestCSV.csv
set outputCSV=TestCSV2.csv

(for /f "tokens=*" %%a IN (%inputCSV%) DO (
  set column=0
  set "line="
  for %%i in ( %%a ) do ( 
    set /a column+=1
    set value=%%~i
    if !column!==4 (   
      if "!value!"=="TEST" set "value=abc"
    ) 
    set "line=!line!,"!value!"" 
  )
  echo !line:~1!
))>%outputCSV%

ID,Name,Date,Field1,Test Data  Space Check
1010101,Test 1,01/27/2001 10:00:00 PM,TEST,Test Data  Space Check
2020202,Test 2,01/27/2001 10:00:00 PM,TEST,Test Data  Space Check
3030303,Test 3,01/27/2001 10:00:00 PM,TEST,Test Data  Space Check
4040404,Test 4,01/27/2001 10:00:00 PM,TEST,Test Data  Space Check
5050505,Test 5,01/27/2001 10:00:00 PM,TEST,Test Data  Space Check

我也试过这个,但没有用。

@echo off
setlocal enabledelayedexpansion
set inputCSV=TestCSV.csv
set outputCSV=TestCSV2.csv
:: tokens=* 
(for /f "tokens=*" %%a IN (%inputCSV%) DO (
  set column=0
  set "line="
  for /f "delims=," %%i in ( %%a ) do ( 
    set /a column+=1
    set value=%%~i
    if !column!==4 (   
      if "!value!"=="TEST" set "value=ABC"
    ) 
    set "line=!line!,"!value!"" 
  )
  echo !line:%%a!
))>%outputCSV%

这是最终输出的样子 最终输出

旧帖子:使用批处理脚本将 CSV 中特定列中的空值替换为 0

标签: csvbatch-file

解决方案


从您的 excel 图像来看,您使用的编辑器中的 BOM(字节顺序标记)似乎也存在问题。

您引用的旧帖子不同,因为所有字段都被引用。

要在逗号处拆分 csv,请在 for /f 中使用逗号作为分隔符(前提是字段数据中没有逗号)

要交换文本,请使用字符串替换(需要复制到代码块内的常规(非元)变量,而这又需要延迟扩展)。

这批:

:: Q:\Test\2019\01\22\SO_54312302.cmd
@echo off
setlocal enabledelayedexpansion
set inputCSV=TestCSV.csv
set outputCSV=TestCSV2.csv

(for /f "tokens=1-4* delims=," %%a IN (%inputCSV%) DO (
  set "col4=%%d"
  set "col4=!col4:foo=bar!"
  Set "col4=!col4:test=abc!"
  echo %%a,%%b,%%c,!col4!,%%e
))>%outputCSV%

产生这个输出:

> type TestCSV2.csv
ID,Name,Date,Field1,Test Data  Space Check
1010101,Test 1,01/27/2001 10:00:00 PM,abc,Test Data  Space Check
2020202,Test 2,01/27/2001 10:00:00 PM,abc,Test Data  Space Check
3030303,Test 3,01/27/2001 10:00:00 PM,abc,Test Data  Space Check
4040404,Test 4,01/27/2001 10:00:00 PM,abc,Test Data  Space Check
5050505,Test 5,01/27/2001 10:00:00 PM,abc,Test Data  Space Check

在 Excxel 中导入时,使用逗号作为分隔符。


推荐阅读