【问题标题】:How to import Powershell CSV month names如何导入 Powershell CSV 月份名称
【发布时间】:2020-10-13 19:10:45
【问题描述】:

我有一个 CSV(5k 行),它是通过具有此标题的软件格式化的:

groupname,id,name,email,active,created,Last seen in software A,Last seen in software B,Last seen in software C,Software A,Software B,Software C

下面的行看起来像这样: test-group,userID123,John Doe,jdoe@company.com,Yes,18 May 2017,22 Jun 2020,22 Jun 2020,22 Jun 2020,No,Yes,Yes


我想知道,鉴于 CSV 的日期格式为“日、月名、年”,我该如何过滤数据。 例如:我想过滤我在过去 90 天内没有见过的人,并且结果只搜索“软件 A”是否为“是”。

我还想添加更多参数,例如查看用户是否有:-and (email -like "*company.com") 等。

我以前在 AD 上搜索过,但没有从 CSV 导入。

$daysnumber= Read-Host 'Days since login'
(get-date).adddays(-$daysnumber)
$data = import-csv "userlist.csv"
$data | foreach-object {
New-Object PSObject -prop @{
"Last Seen in Software A" = [DateTime]::Parse("$_.Last Seen in Software A")
}
}

---更新--- 我走上了另一条路。我已经替换了日期的格式,因此我不再需要处理月份名称。 但我在验证数据甚至在控制台上显示或输出到 CSV 文件时遇到问题..

#Reads the file and then change all the months name to numeric value for ease of acces and sorting.
$original_file = 'C:\SCRIPTS\data\export-users.csv'
$destination_file =  'C:\SCRIPTS\data\export-users-replaced.csv'
(Get-Content $original_file) | Foreach-Object {
    $_ -replace 'Jan', '01' `
       -replace 'Feb', '02' `
       -replace 'Mar', '03' `
       -replace 'Apr', '04' `
       -replace 'May', '05' `
       -replace 'Jun', '06' `
       -replace 'Jul', '07' `
       -replace 'Aug', '08' `
       -replace 'Sep', '09' `
       -replace 'Oct', '10' `
       -replace 'Nov', '11' `
       -replace 'Dec', '12' `
       -replace 'Never logged in', '01 01 1990' `
    } | Set-Content $destination_file

    

#properties    = 'groupname','id','name','email','active','created','Last seen in Jira Service Desk','Last seen in Jira Software','Last seen in Confluence','Jira Service Desk','Jira Software','Confluence'
Import-Csv $destination_file | ForEach-Object {
    $groupname += $_.groupname
    $id += $_.id
    $name += $_.name
    $email += $_.email
    $active += $_.active
    #JSD (Jira service desk)
    $lastjsd += $_."Last Seen in Jira Service Desk"
    #JSW (Jira Software)
    $lastjsw += $_."Last seen in Jira Software"
    #JCF (Jira Confluence)
    $lastjcf += $_."Last Seen in Confluence"
    $licjsd += $_."Jira Service Desk"
    $licjsw += $_."Jira Software"
    $licjcf += $_.Confluence
} 

# Write-Host $active

$daysnumber= Read-Host 'Cantidad de dias'
$emaildomain=Read-Host 'Dominio de mails. Escriba "@dominio.com"'
$days   =  (get-date).adddays(-$daysnumber).ToString('dd MM yyyy')
Write-Host "Si desea buscar licencias de Service Desk ingrese Service,
Si desea buscar licencias de Jira Software ingrese Software,
Si desea buscar licencias de Confluence ingrese Confluence"

$license= Read-Host " ( service / software / confluence ) "
    switch ($license) {
        service {Where-Object $lastjcf -LE $days | Format-List | Out-String | Export-Csv -Path "C:\SCRIPTS\jiratest.csv"   -Encoding UTF8 -Append -NoTypeInformation
         }
        software { Write-Host "nope"}
        confluence { Write-Host "no"}
    }

# Select-Object email -eq *$emaildomain* -and 'Last seen in Confluence' -le $days


# -and $licjsd -eq "Yes" -and $active -Is "Yes"

希望有人可以指导我如何制作这个低谷!

谢谢。

【问题讨论】:

  • (get-date).adddays(-$daysnumber) --> $daysSince = (Get-Date).AddDays(-[int]$daysnumber).Date[DateTime]::Parse("$_.Last Seen in Software A") --> [datetime]::ParseExact($_.'Last Seen in Software A', 'dd MMM yyyy', $null)
  • @Theo !谢谢(你的)信息!我对代码没有运气,因为我有很多解析错误。我继续走另一条路。将在下面附上我的代码。

标签: powershell csv sorting parsing foreach


【解决方案1】:

我认为没有必要将所有月份的短名称替换为数值,但下面我在 $format 变量前添加了注释,因此您可以根据需要进行设置。

另外,(据我所知)不需要为 CSV 中的所有字段创建类似数组的变量,因为在 Import-Csv 之后它们都可用。

试试这个缩短的代码:

# 'groupname','id','name','email','active','created','Last seen in Jira Service Desk','Last seen in Jira Software','Last seen in Confluence','Jira Service Desk','Jira Software','Confluence'
$data = Import-Csv -Path 'C:\SCRIPTS\data\export-users.csv'

$daysnumber  = Read-Host 'Cantidad de dias'                # remember that Read-Host returns a string
$emaildomain = Read-Host 'Dominio de mails. Escriba "@dominio.com"'
$days        = (Get-Date).AddDays(-[int]$daysnumber).Date  # get a DateTime object and disregard the time part (set to midnight)

Write-Host "Si desea buscar licencias de Service Desk ingrese Service,
Si desea buscar licencias de Jira Software ingrese Software,
Si desea buscar licencias de Confluence ingrese Confluence"

$license = Read-Host " ( service / software / confluence ) "

# the date format used to parse out the date from the CSV file
$format  = 'dd MM yyyy'   # for dates like '22 Jun 2020' use 'dd MMM yyyy'

switch ($license) {
    'service' {
        $fileOut  = 'C:\SCRIPTS\jiraServiceDeskTest.csv'
        $property = 'Last Seen in Jira Service Desk'
        $data | Where-Object { [datetime]::ParseExact($_.$property, $format, $null) -le $days } | 
                Export-Csv -Path $fileOut -Encoding UTF8 -Append -NoTypeInformation
    }
    'software' { 
        $fileOut  = 'C:\SCRIPTS\jiraSoftwareTest.csv'
        $property = 'Last seen in Jira Software'
        $data | Where-Object { [datetime]::ParseExact($_.$property, $format, $null) -le $days } | 
                Export-Csv -Path $fileOut -Encoding UTF8 -Append -NoTypeInformation
    }
    'confluence' { 
        $fileOut  = 'C:\SCRIPTS\jiraConfluenceTest.csv'
        $property = 'Last Seen in Confluence'
        $data | Where-Object { [datetime]::ParseExact($_.$property, $format, $null) -le $days } | 
                Export-Csv -Path $fileOut -Encoding UTF8 -Append -NoTypeInformation
    }
    default { Write-Host "Wrong input" } 
}

建议(稍后)添加测试以查看来自各种Read-Host cmdlet 的用户输入是否真的可以接受。

【讨论】:

  • 嗨西奥!谢谢你的帮助。它有很多解析错误。我尝试使用我用数字替换每个月名称的版本。现在的日期格式是 d MM yyyy。在days 部分,我已更改为$days= (get-date).adddays(-$daysnumber).ToString('d MM yyyy') 在Where 对象中我尝试了``` $data | Where-Object { ($_.$property -le $days) -and ($_.active -match $active) -and ($_."Jira Service Desk" -match $active)}|```我是一个结果,但不是我想要的。结果是最近登录的人,而不是过去 90 天内未登录的人。
  • @FefeGodoy 总是将日期与 dates 进行比较,而不是一些字符串表示。如果存在解析错误,则 csv 中的日期格式不是您描述的。
  • @FedeGodoy 仔细观察,您的问题表明 CSV 文件中的标题是这样的:groupname,id,name,email,active,created,Last seen in software A,Last seen in software B,Last seen in software C,Software A,Software B,Software C。但是,您显示的代码使用了非常不同的列名。这意味着没有什么要解析的,因为在 csv 中没有像 'Last Seen in Jira Service Desk''Last Seen in Confluence' 这样的字段名称。请解释一下 REAL 文件中的标题以及哪个字段映射到什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多