Looking for something better than split and join

140 views
Skip to first unread message

Andy

unread,
Oct 21, 2008, 12:10:48 PM10/21/08
to
I have a string that looks like "/vol/InfraDev_AppDev03/VHD.lun"
I need to do something so I can get

$vol = "/vol/InfraDev_AppDev03/"
$lun = "VHD.lun"

My first solution (which works but I just think its not so elegant)
is to split the string on "/" and then do a join on "/" with the first
two elements in the result of the split and set that to $vol, and then
leave the third element as $lun.

I am no regex kung fu master, but I was wondering if there was a
slightly more elegant way to solve this problem.

Thanks,

Andy

Shay Levy [MVP]

unread,
Oct 21, 2008, 12:28:59 PM10/21/08
to
Hi Andy,

An alternative is to use the split-path cmdlet:

PS > split-path "/vol/InfraDev_AppDev03/VHD.lun" -leaf
VHD.lun


The problem is that split-path replaces each slash with a backslash in case
of this:

PS > split-path "/vol/InfraDev_AppDev03/VHD.lun" -Parent
\vol\InfraDev_AppDev03

A safer solution is a combination of substring() and lastIndexOf() methods:

PS > $p.substring($p.lastIndexOf("/")+1)
VHD.lun


PS > $p.substring(0,$p.lastIndexOf("/")+1)
/vol/InfraDev_AppDev03


---
Shay Levy
Windows PowerShell MVP
http://blogs.microsoft.co.il/blogs/ScriptFanatic
PowerShell Toolbar: http://tinyurl.com/PSToolbar

A> I have a string that looks like "/vol/InfraDev_AppDev03/VHD.lun" I
A> need to do something so I can get
A>
A> $vol = "/vol/InfraDev_AppDev03/"
A> $lun = "VHD.lun"
A> My first solution (which works but I just think its not so elegant)
A> is to split the string on "/" and then do a join on "/" with the
A> first
A> two elements in the result of the split and set that to $vol, and
A> then
A> leave the third element as $lun.
A> I am no regex kung fu master, but I was wondering if there was a
A> slightly more elegant way to solve this problem.
A>
A> Thanks,
A>
A> Andy
A>


Andy

unread,
Oct 21, 2008, 12:45:41 PM10/21/08
to
On Oct 21, 9:28 am, Shay Levy [MVP] <n...@addre.ss> wrote:
> Hi Andy,
>
> An alternative is to use the split-path cmdlet:
>
> PS > split-path "/vol/InfraDev_AppDev03/VHD.lun" -leaf
> VHD.lun
>
> The problem is that split-path replaces each slash with a backslash in case
> of this:
>
> PS > split-path "/vol/InfraDev_AppDev03/VHD.lun" -Parent
> \vol\InfraDev_AppDev03
>
> A safer solution is a combination of substring() and lastIndexOf() methods:
>
> PS > $p.substring($p.lastIndexOf("/")+1)
> VHD.lun
>
> PS > $p.substring(0,$p.lastIndexOf("/")+1)
> /vol/InfraDev_AppDev03
>
> ---
> Shay Levy
> Windows PowerShell MVPhttp://blogs.microsoft.co.il/blogs/ScriptFanatic

> PowerShell Toolbar:http://tinyurl.com/PSToolbar
>
> A> I have a string that looks like "/vol/InfraDev_AppDev03/VHD.lun" I
> A> need to do something so I can get
> A>
> A> $vol = "/vol/InfraDev_AppDev03/"
> A> $lun = "VHD.lun"
> A> My first solution (which works but I just think its not so elegant)
> A> is to split the string on "/" and then do a join on "/" with the
> A> first
> A> two elements in the result of the split and set that to $vol, and
> A> then
> A> leave the third element as $lun.
> A> I am no regex kung fu master, but I was wondering if there was a
> A> slightly more elegant way to solve this problem.
> A>
> A> Thanks,
> A>
> A> Andy
> A>

Thanks Shay, much appreciated

Andy

Tao Ma

unread,
Oct 22, 2008, 11:41:33 AM10/22/08
to
Hi Andy,

Shay levy has already answered your question.

I paste a more tricky way to solve your problem:

PS C:\> $s = "/vol/InfraDev_AppDev03/VHD.lun"
PS C:\> $vol, $lun = ($s -replace '/([^/]*)$',"/`n`$1").split("`n")
PS C:\> $vol
/vol/InfraDev_AppDev03/
PS C:\> $lun
VHD.lun

The core of my code is ($s -replace '/([^/]*)$',"/`n`$1").split("`n"). The
regular expression inserts an new line character after the last slash. Then
split() splits the string using new line as the separator. Finally, assign
the two parts returned from the split() to the variable vol and lun
separately.

Best wishes,
Tao Ma

"Andy" <an...@get-powershell.com> ????
news:1f1cd9f8-1c44-4666...@25g2000prz.googlegroups.com...

Flowering Weeds

unread,
Oct 23, 2008, 5:07:19 PM10/23/08
to

>
> The problem is that split-path
> replaces each slash with a
> backslash in case of this:
>
> PS > split-path "/vol/InfraDev_AppDev03/VHD.lun" -Parent
> \vol\InfraDev_AppDev03
>

Mmm data parsing!

Perhaps do it the same way
in any Windows process!

So using the _automation_ tool,
powershell.exe:

$path = "/vol/InfraDev_AppDev03/VHD.lun"

$path | LogParser.exe "SELECT
EXTRACT_FILENAME(text) AS Filename,
STRCAT(
EXTRACT_PATH(text), '/') AS Path
FROM STDIN " -i textline -stats off

Returns:

Filename Path
-------- ----------------------
VHD.lun /vol/InfraDev_AppDev03/

Have some data parsing fun,
Log Parser it!


Reply all
Reply to author
Forward
0 new messages