Powershell 需要windows脚本从csv文件中删除特定列

Powershell 需要windows脚本从csv文件中删除特定列,powershell,csv,batch-file,delimiter,windows-scripting,cmd,Powershell,Csv,Batch File,Delimiter,Windows Scripting,Cmd,我有一个CSV文件(下面提供的格式),分隔符设置为,。 作为输出,我们希望从下面的CSV中删除第4列(值) 我们只需要在WINDOWS批处理脚本中使用它,因为服务器上不允许其他脚本设置。服务器也有powershell,但我们不确定如何利用powershell命令来达到以下目的 CSV如下所示: ID, NAME, SR, Values, Status "1", "Raj", "123", "A,B,C,D,E", "False" "2", "Rahul", "456", "C", "

我有一个CSV文件(下面提供的格式),分隔符设置为
。 作为输出,我们希望从下面的CSV中删除
第4列(值)

我们只需要在WINDOWS批处理脚本中使用它,因为服务器上不允许其他脚本设置。服务器也有powershell,但我们不确定如何利用powershell命令来达到以下目的

CSV如下所示:

ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False" 
ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False"
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"
我们尝试了此方法,但效果不理想:

(Get-Content .\testCSV.csv) | Foreach-Object { $_.split()[4] -join ' ' } | Out-File .\file.txt
预期结果(删除“值”列)


与其尝试将CSV作为平面文本进行破解和刮取,不如将其对象化,然后选择要保留的属性

test.csv:

ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False" 
ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False"
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"
test.ps1:

ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False" 
ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False"
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"
结果:

ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False" 
ID, NAME, SR, Values, Status  
"1", "Raj", "123", "A,B,C,D,E", "False"    
"2", "Rahul", "456", "C", "False"
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源来自管道而不是文件,请改用。

如果您使用内置的CSV功能导入CSV,您可以使用
选择对象的
-ExcludeProperty
排除属性/列

从提示符或脚本:

导入CSV。\testCSV.CSV |选择对象*-排除属性值|导出CSV。\Modified.CSV-NoTypeInformation
来自或来自:

PowerShell-NoP“IpCSV.\testCSV.csv |选择*-Exc值| EpCSV.\Modified.csv-不”
@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
设置“filename1=%sourcedir%\q56003792.txt”
设置“outfile=%destdir%\outfile.txt”
(
对于/f“usebackqdelims=“%a IN”(“%filename1%”)中的DO CALL:drop4%%a
)>“%outfile%”
后藤:EOF
:下降4
::将所有数据发送到“行”
设置“行=%*”
调用ECHO%%行:**%1、%2、%3、%4、=%1、%2、%3、%
后藤:eof
您需要更改
sourcedir
destdir
的设置以适应您的环境

我使用了一个名为
q56003792.txt
的文件,其中包含用于测试的数据

生成定义为%outfile%的文件

之所以需要使用
usebackq
选项,是因为我选择在源代码周围添加引号 文件名

由于所有数据行都包含由
分隔的列,
我建议使用这种纯批处理解决方案

序言确定了要使用的目录和文件名。这些是为我的系统定制的

该例程的主要部分是for/f的
for
,它调用子例程
drop4
,逐字提供每个完整的文本行。
用括号括起来,用于将整个例程输出重定向到指定的文件

子例程只是将参数分配给标准环境变量(因为批处理子字符串只能应用于普通变量)


call echo
行在替换了提供的参数%1..%4后执行
echo
,因此字符串
echo
ed将是原始行,所有字符最多为[前4个参数,由
分隔,
]替换为[前3个参数,由
分隔,
]-删除第4列。

首先,澄清您需要什么——如果您在尝试编写PowerShell代码时需要帮助,请提供一个(因为“它未按预期工作”不是错误描述,因此请详细说明)并应用相关标记。如果你需要一个免费的批处理文件,那么,你在这里完全错了,因为这个网站不是一个免费的脚本服务;因此,采取行动和咨询!如果您尝试了批处理文件和PowerShell方法,请使用每种编码语言发布一个特定问题!
-NoTypeInformation
的别名是
-NTI
,根据。也是,1。与我自己的答案相比,我更喜欢你的
-ExcludeProperty
解决方案。我知道别名@rojo,虽然我对
NoTypeInformation
的缩短目前会受到参数未来变化的影响,但我更喜欢在键入时使用它。如果OP需要,我非常满意他们用
NTI
替换
NoT
,正如您所评论的。