【问题标题】:Divide a string in a CSV file在 CSV 文件中分割字符串
【发布时间】:2017-01-15 14:28:45
【问题描述】:

我在 CSV 文件中有以下数据

"Name","SourceIP","DestinationIP"
"Sep  1 03:55:57 mmt-5","172.16.48.158","22.22.22.22"
"Sep  1 03:55:57 mmt-5","172.16.48.158","22.22.22.22"
"Sep  1 03:55:57 mmt-5","172.16.48.158","22.22.22.22"
"Sep  1 03:55:57 mmt-5","172.16.48.158","22.22.22.22"

我需要将Name 列拆分为另外 3 列。 Date、Time 和 Name。像下面这样

"Date","Time","Name","SourceIP","DestinationIP"
"Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
"Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
"Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
"Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"

对如何完成有点迷茫。我试过用逗号替换第 14 个字符,但没有运气。

$test = import-csv C-sample.csv

$test | foreach-object {
    $_.Name = $_.Name.Replace(14, ",")
}

$test | export-csv D-sample.csv -notype

有什么帮助吗?

【问题讨论】:

    标签: regex string powershell csv powershell-2.0


    【解决方案1】:

    我将使用regex 解析字符串并创建一个新的PSCustomObject 以将其导出:

    $test = import-csv C-sample.csv
    $regex = '(?<Date>\w+\s+\d{1,2})\s+(?<Time>\d{2}:\d{2}:\d{2})\s+(?<Name>.*)'
    
    $test | foreach-object {
        $regMatch = [regex]::Match($_.Name, $regex)
        [PSCustomObject]@{
            Date = $regMatch.Groups['Date'].Value
            Time = $regMatch.Groups['Time'].Value
            Name = $regMatch.Groups['Name'].Value
            SourceIP = $_.SourceIP
            DestinationIP = $_.DestinationIP
        }
    } | export-csv D-sample.csv -notype
    

    正则表达式:

    (?<Date>\w+\s+\d{1,2})\s+(?<Time>\d{2}:\d{2}:\d{2})\s+(?<Name>.*)
    


    输出:

    "Date","Time","Name","SourceIP","DestinationIP"
    "Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
    "Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
    "Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
    "Sep  1","03:55:57","mmt-5","172.16.48.158","22.22.22.22"
    

    编辑:

    由于您使用的是 PowerShell 2,因此您不能在哈希表上使用 PsCustomObject 强制转换,因此请改用它:

    $test = import-csv C-sample.csv
    $regex = '(?<Date>\w+\s+\d{1,2})\s+(?<Time>\d{2}:\d{2}:\d{2})\s+(?<Name>.*)'
    
    $test | foreach-object {
        $regMatch = [regex]::Match($_.Name, $regex)
    
           $object = New-Object PSObject
           Add-Member -InputObject $object -memberType NoteProperty -Name Date -Value  $regMatch.Groups['Date'].Value
           Add-Member -InputObject $object -memberType NoteProperty -Name Time -Value $regMatch.Groups['Time'].Value
           Add-Member -InputObject $object -memberType NoteProperty -Name Name -Value $regMatch.Groups['Name'].Value
           Add-Member -InputObject $object -memberType NoteProperty -Name SourceIP -Value $_.SourceIP
           Add-Member -InputObject $object -memberType NoteProperty -Name DestinationIP -Value $_.DestinationIP
           $object
    } | export-csv D-sample.csv -notype
    

    【讨论】:

    • 谢谢,但我没有得到那个输出。这就是我得到的。 "IsReadOnly","IsFixedSize","IsSynchronized","Keys","Values","SyncRoot","Count" "False","False","False","System.Collections.Hashtable+KeyCollection","System.Collections.Hashtable+ValueCollection","System.Object","5"
    • 您是否更改了我的脚本中的任何内容?如果没有,您使用的是哪个 PowerShell 版本?
    • 那么您可能需要更改创建 pscustomobject 的方式。让我编辑我的答案。
    • 工作完美。感谢您的帮助。
    • 不客气。考虑更新您的 PowerShell 版本 :-)
    猜你喜欢
    • 2023-01-10
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2017-08-27
    • 2011-03-26
    • 1970-01-01
    相关资源
    最近更新 更多