2016-09-07 2 views
2

У меня есть следующие данные в CSV файлРазделить строку в 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 

Любая помощь?

ответ

3

Я бы разобрать строку с помощью 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 

Regex:

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

Regular expression visualization


Выход:

"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" 

Edit:

Поскольку вы используете PowerShell 2, вы не можете использовать PsCustomObject бросок на Hashtable, так что используйте вместо этого:

$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 
+0

Спасибо, но я не получаю этот вывод. Это то, что я получаю. «IsReadOnly», «IsFixedSize», «IsSynchronized», «Keys», «Values», «SyncRoot», «Count» «False», «False», «False», «System.Collections.Hashtable + KeyCollection» "," System.Collections.Hashtable + ValueCollection "," System.Object "," 5 " ' – Eric

+0

Вы что-то изменили в моем скрипте? Если нет, какую версию PowerShell вы используете? –

+0

2. Я немного новичок, должен ли я обновлять? – Eric