нужен сценарий Windows, чтобы удалить определенный столбец из CSV-файла - PullRequest
0 голосов
/ 06 мая 2019

У меня есть файл 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"

Ответы [ 3 ]

2 голосов
/ 06 мая 2019

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

Из или сценария:

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

Из или :

PowerShell -NoP "IpCSV .\testCSV.csv|Select * -Exc Values|EpCSV .\Modified.csv -NoT"
2 голосов
/ 06 мая 2019

Вместо того, чтобы пытаться взломать и очистить ваш 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.

1 голос
/ 06 мая 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, поэтому строка echo ed будет исходной строкой со всеми символами до [первых 4 параметров,разделены ,] заменены на [первые 3 параметра, разделены ,] - столбец удаления 4.

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