2013-06-12 2 views
0

У меня есть список путей к папкам в файле csv, например.Powershell regex для разделения пути папки (csv-файл)

\Customer 
\Customer\Customer A 
\Customer\Customer A\Bob 
\Customer\Customer B 
\Supplier 
"\Supplier\Supplier, A, B" 

Обратите внимание на двойные кавычки

Что мне нужно сделать, это разделить каждую строку на последний «\», так что данные затем

,Customer 
\Customer,Customer A 
\Customer\Customer A,Bob 
\Customer,Customer B 
,Supplier 
"\Supplier","Supplier, A, B" 

Обратите внимание на двойные кавычки

Я хотел бы, чтобы любой код находился в powershell, если это вообще возможно. Я попытался использовать notepad ++, используя (.*)\\, который выбирает все до и включая последний «\», но не знает, как переключить его для «,». Это также не помогает мне с двойными кавычками.

ответ

1
$pattern = '\\([^\\]+)$' 

$paths | Foreach-Object { 

    if($_ -like '"*"') 
    { 
     $_ -replace $pattern,'","$1' 
    } 
    else 
    { 
     $_ -replace $pattern,',$1'  
    } 

} 
+0

+1 Я удалил свой ответ, потому что я редактировал его, чтобы управлять кавычку сделать ваш же решение. –

+0

@Aftab убедитесь, что $ paths содержит только строки. Как выглядит ваш файл csv? –

+0

У меня возникли две проблемы с приведенным выше примером, единственное, что я изменил: $ path стал import-csv. \ Test.csv Ниже приведен вывод '@ {\ Customer = \ Customer, Customer A} @ {\ Customer = \ Customer \ Customer A, Bob} @ {\ Customer = \ Customer, Customer B} @ {\ Customer =, Supplier} @ {\ Customer = \ Поставщик, Поставщик, A, B} ' 1. _ \ Customer = _ всегда появляется в каждой строке вывода. 2. Первый оператор if не работает, потому что Powershell удаляет двойные кавычки из значения пути при его импортировании из csv, как мне изменить это поведение. – Aftab

0

Вы можете использовать String.LastIndexOf для нахождения точки разделения. Предполагая, что все, что вы хотите, это список строк, которые включают в себя изменения, что-то, как это должно работать:

[String[]] $l = '\Customer', 
'\Customer\Customer A', 
'\Customer\Customer A\Bob', 
'\Customer\Customer B', 
'\Supplier', 
'"\Supplier\Supplier, A, B"' 

[String[]] $r = @() 

foreach ($x in $l) 
{ 
    # work out whether we need to double-quote or not 
    if (($x[0] -eq '"') -and ($x[$x.Length - 1] -eq '"')) 
    { 
     $joiner = '","' 
    } 
    else 
    { 
     $joiner = ',' 
    } 

    $i = $x.LastIndexOf('\') 
    $s = [String]::Concat($x.Substring(0, $i), $joiner, $x.Substring($i + 1)) 

    $r = $r + $s 
} 

$r # contains your output 
Смежные вопросы