Необходимо заменить конкретный текст в CSV-файле, используя пакетный скрипт - PullRequest
0 голосов
/ 22 января 2019

Я хочу заменить определенный текст в 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

Старая публикация: Использование пакетного сценария для замены нулевых значений на 0 в определенном столбце в CSV

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вам нужен хороший инструмент CSV, как Миллер (http://johnkerl.org/miller/doc)

Это очень просто. С

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

Это отличный open sourceмультиплатформенная утилита. Здесь у вас также есть win exe https://github.com/johnkerl/miller/releases/tag/5.4.0

0 голосов
/ 22 января 2019

Вы могли бы, я полагаю, использовать 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"
0 голосов
/ 22 января 2019

Из вашего изображения Excel вы также, похоже, испытываете проблему с спецификацией (меткой порядка байтов) в используемом вами редакторе.

Старый пост, на который вы ссылаетесь, отличается тем, что все поля указаны в кавычках.

Чтобы разделить 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 используйте запятую в качестве разделителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...