其中对象保留空白行

时间:2018-10-25 20:55:21

标签: powershell

我再次陷入了应该如此简单的事情。我有一个CSV文件,需要在其中进行一些字符串修改并将其导出。数据如下:

FullName
--------

\\server\project\AOI
\\server\project\AOI\Folder1
\\server\project\AOI\Folder2
\\server\project\AOI\Folder3\User

我需要执行以下操作:

  • 从每行中删除“ \\ server \ project”,但保留其余部分
  • 删除所有没有文件夹的行(例如,在上面的示例中,第一行将被删除,而其他三行将保留)
  • 删除路径中带有“用户”一词的任何行
  • 为每条记录添加一个名为“ T / F”的列,其值为“ FALSE”

这是我最初的尝试:

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命令运行输出文件。对于某些本应简单的事情来说,这一切似乎都过于复杂。

那么,我想念什么?

3 个答案:

答案 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

注释...

  • 在属性名称中加上斜杠是... icky [ grin ]
    这要求您每次访问属性名称时都将其括在引号中。尝试另一个名称-也许是“正确”。
  • 您可以单独使用$_测试空白数组项[行]
  • [regex]::Escape()东西真的很方便