нужен скрипт Windows для удаления определенного столбца из CSV-файла

У меня есть файл CSV (формат указан ниже) с разделителем, установленным на , . В качестве вывода мы хотели бы удалить column 4 ( Values ) снизу CSV.

Нам это нужно только в пакетном сценарии WINDOWS, поскольку на сервере не разрешена другая настройка сценариев. На сервере также есть powershell, но мы не уверены, как использовать команды powershell для достижения следующих целей.

Файл CSV выглядит следующим образом:

ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False" 

Мы попробовали это, но оно не работает должным образом:

(Get-Content .\testCSV.csv) | Foreach-Object { $_.split()[4] -join ' ' } | Out-File .\file.txt

Ожидаемый результат (удален столбец «Ценности»)

ID, NAME, SR, Status
"1", "Raj", "123", "False"
"2", "Rahul", "456" , "False"

person Vicky    schedule 06.05.2019    source источник
comment
Сначала уточните, что вам нужно — если вам нужна помощь с попыткой написания кода PowerShell, предоставьте минимально воспроизводимый пример (поскольку это не работает должным образом, это не описание ошибки, поэтому, пожалуйста, уточните) и примените соответствующий тег powershell. Если вам нужен пакетный файл бесплатно, вы просто ошибаетесь, так как этот сайт не является бесплатной службой сценариев; поэтому пройдите тур и проконсультируйтесь Как Спросите! Если вы пробовали как пакетный файл, так и подход PowerShell, опубликуйте один конкретный вопрос с минимально воспроизводимым примером для каждого язык кодирования!   -  person aschipfl    schedule 06.05.2019


Ответы (3)


Вместо того, чтобы пытаться взломать и очистить CSV-файл как простой текст, гораздо проще его объективировать, а затем выбрать свойства, которые вы хотите сохранить.

test.csv:

ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False"

test.ps1:

ipcsv test.csv | select ID,NAME,SR,Values | export-csv test2.csv -NTI

результат:

"ID","NAME","SR","Values"
"1","Raj","123","A,B,C,D,E"
"2","Rahul","456","C"

Если ваш источник CSV поступает из конвейера, а не из файла, вместо этого используйте ConvertFrom-CSV.

person rojo    schedule 06.05.2019

Если вы используете встроенную функцию CSV Import-CSV, вы можете исключить свойство/столбец, используя -ExcludeProperty Select-Object.

Из подсказки или скрипта powershell:

Import-CSV .\testCSV.csv | Select-Object * -ExcludeProperty Values | Export-CSV .\Modified.csv -NoTypeInformation

Из cmd или batch-file:

PowerShell -NoP "IpCSV .\testCSV.csv|Select * -Exc Values|EpCSV .\Modified.csv -NoT"
person Compo    schedule 06.05.2019
comment
Псевдоним для -NoTypeInformation-NTI в соответствии с документы MSFT. Также +1. Ваше решение -ExcludeProperty мне нравится больше, чем мой собственный ответ. - person rojo; 06.05.2019
comment
Я знаю псевдоним @rojo, и хотя мое сокращение NoTypeInformation в настоящее время подлежит будущим изменениям в параметрах, я предпочитаю использовать его при наборе текста. Я более чем доволен, если ОП потребует этого, чтобы они заменили NoT на NTI, как вы прокомментировали. - person Compo; 06.05.2019

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q56003792.txt"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO CALL :drop4 %%a
)>"%outfile%"

GOTO :EOF

:drop4
:: all data to 'line'
SET "line=%*"
CALL ECHO %%line:*%1, %2, %3, %4, =%1, %2, %3, %%
GOTO :eof

Вам нужно будет изменить настройки sourcedir и destdir в соответствии с вашими обстоятельствами.

Для тестирования я использовал файл с именем q56003792.txt, содержащий ваши данные.

Создает файл, определенный как %outfile%

Параметр usebackq требуется только потому, что я решил добавить кавычки вокруг имени исходного файла.

Поскольку все ваши строки данных содержат столбцы, разделенные ,, я предлагаю это чисто пакетное решение.

Преамбула устанавливает каталог и имена файлов, которые будут использоваться. Они настроены для моей системы.

Основная часть подпрограммы — это for/f, которая вызывает подпрограмму drop4, предоставляющую дословно всю текстовую строку. for заключен в круглые скобки, чтобы перенаправить весь вывод подпрограммы в указанный файл.

Подпрограмма просто присваивает параметры стандартной переменной среды (поскольку пакетная подстрока может применяться только к обычным переменным).

Строка call echo выполняет echo с заменой предоставленных параметров %1..%4, поэтому строка echoed будет исходной строкой со всеми символами до [первые 4 параметра, разделенные ,], замененными на [первые 3 параметра, разделенные by ,] — ​​удаление столбца4.

person Magoo    schedule 06.05.2019