需要使用批处理脚本替换CSV文件中的特定文本

时间:2019-01-22 16:14:47

标签: csv batch-file

我想替换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%

这是最终输出的外观 Final Output

旧帖子:Use batch scripting to replace null values with 0 in a specific column in a CSV

3 个答案:

答案 0 :(得分:0)

在您的excel图片中,您似乎还遇到了旧编辑器的BOM(字节顺序标记)问题。

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

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

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

这批:

:: 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中导入时,请使用逗号作为定界符。

答案 1 :(得分:0)

您需要一个像Miller(http://johnkerl.org/miller/doc)一样好的CSV工具

这很简单。与

mlr.exe --csv put '$Field1=gsub($Field1,"TEST","Foo")' input.csv

您有

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

这是一个很棒的开源多平台实用程序。在这里,您还拥有win exe https://github.com/johnkerl/miller/releases/tag/5.4.0

答案 2 :(得分:0)

我想,您可以从批处理文件中使用PowerShell。

基本示例:

@PowerShell -NoP -C "Import-Csv '.\TestCSV.csv'"^
 "|%%{$_.'Field1'=$_.'Field1' -CReplace('^TEST$','ABC');$_}"^
 "|ConvertTo-CSV -N|Out-File '.\TestCSV2.csv' -Fo -En ASCII"

...并使它更容易理解/修改

@Echo Off
Set "Inp=.\TestCSV.csv"
Set "Out=.\TestCSV2.csv"
Set "Col=Field1"
Set "Old=TEST"
Set "New=ABC"

PowerShell -NoProfile -Command "Import-Csv '%Inp%' "^
 "| ForEach-Object {$_.'%Col%'=$_.'%Col%' -CReplace('^%Old%$','%New%'); $_} "^
 "| ConvertTo-CSV -NoTypeInformation | Out-File '%Out%' -Force -Encoding ASCII"