需要Windows脚本从CSV文件中删除特定的列

时间:2019-05-06 10:57:47

标签: powershell csv batch-file delimiter windows-scripting

我有一个CSV文件(以下提供格式),分隔符设置为,。 作为输出,我们想从CSV下面删除column 4 ( Values )

我们仅在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 个答案:

答案 0 :(得分:2)

与其尝试将CS​​V文本砍成纯文本,不如将其客观化,然后选择要保留的属性,就容易得多。

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 :(得分:2)

如果您使用Import-CSV的内置CSV功能,则可以使用Select-Object的{​​{1}}排除属性/列。

提示符或脚本中:

-ExcludeProperty

来自

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

答案 2 :(得分:1)

@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

您需要根据自己的情况更改sourcedirdestdir的设置。

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

产生定义为%outfile%的文件

usebackq选项是必需的,因为我选择在源代码周围添加引号 文件名。

由于您的所有数据行均包含以,分隔的列,因此我建议使用这种纯批量解决方案。

序言建立要使用的目录和文件名。这些是针对我的系统定制的。

该例程的主要内容是for/f,它调用子例程drop4逐字提供每个完整的文本行。 for括在括号中,以将整个例程输出重定向到指定文件。

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

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