我再次陷入了应该如此简单的事情。我有一个CSV文件,需要在其中进行一些字符串修改并将其导出。数据如下:
FullName -------- \\server\project\AOI \\server\project\AOI\Folder1 \\server\project\AOI\Folder2 \\server\project\AOI\Folder3\User
我需要执行以下操作:
这是我最初的尝试:
Get-Content C:\Folders.csv |
% {$_.replace('\\server\project\','')} |
Where-Object {$_ -match '\\'} |
#Removes User Folders rows from CSV
Where-Object {$_ -notmatch 'User'} |
Out-File C:\Folders-mod.csv
这在一定程度上有效,除了它删除了我的标题行并且我还没有找到使用Get-Content添加列的方法。为此,我必须使用Import-Csv
,这很好,但是不断重新加载同一文件似乎效率低下。因此,我尝试使用Import-Csv
而不是Get-Content
重写上面的内容:
$Folders = Import-Csv C:\Folders.csv
foreach ($Folder in $Folders) {
$Folder.FullName = $Folder.FullName.Replace('\\server\AOI\', '') |
Where-Object {$_ -match '\\'} |
Where-Object {$_ -notmatch 'User Files'}
}
$Folders | Export-Csv C:\Folders-mod.csv -NoTypeInformation
我还没有添加用于添加新列的编码,但这保留了标题。但是,我最终得到了一堆空行,其中Where-Object
删除了该行,而我发现摆脱它们的唯一方法是通过Get-Content命令运行输出文件。对于某些本应简单的事情来说,这一切似乎都过于复杂。
那么,我想念什么?
答案 0 :(得分:2)
感谢TheMadTechnician指出我做错了什么。这是我的最终脚本(添加了其他列):
$Folders= Import-CSV C:\Folders.csv
ForEach ($Folder in $Folders)
{
$Folder.FullName = $Folder.FullName.replace('\\server\project\','')
}
$Folders | Where-Object {$_ -match '\\' -and $_ -notmatch 'User'} |
Select-Object *,@{Name='T/F';Expression={'FALSE'}} |
Export-CSV C:\Folders.csv -NoTypeInformation
答案 1 :(得分:1)
我将使用表数组和pscustomobject进行此操作。
#Create an empty Array
$Table = @()
#Manipulate the data
$Fullname = Get-Content C:\Folders.csv |
ForEach-Object {$_.replace('\\server\project\', '')} |
Where-Object {$_ -match '\\'} |
#Removes User Folders rows from CSV
Where-Object {$_ -notmatch 'User'}
#Define custom objects
Foreach ($name in $Fullname) {
$Table += [pscustomobject]@{'Fullname' = $name; 'T/F' = 'FALSE'}
}
#Export results to new csv
$Table | Export-CSV C:\Folders-mod.csv -NoTypeInformation
答案 2 :(得分:0)
这里还有另一种方式... [咧嘴]
$FileList = @'
FullName
\\server\project\AOI
\\server\project\AOI\Folder1
\\server\project\AOI\Folder2
\\server\project\AOI\Folder3\User
'@ | ConvertFrom-Csv
$ThingToRemove = '\\server\project'
$FileList |
Where-Object {
# toss out any blank lines
$_ -and
# toss out any lines with "user" in them
$_ -notmatch 'User'
} |
ForEach-Object {
[PSCustomObject]@{
FullName = $_.FullName -replace [regex]::Escape($ThingToRemove)
'T/F' = $False
}
}
输出...
FullName T/F
-------- ---
\AOI False
\AOI\Folder1 False
\AOI\Folder2 False
注释...
$_
测试空白数组项[行] [regex]::Escape()
东西真的很方便