create path hierarchy ...read each line split and insert tabs

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
bish01
Posts: 96
Joined: 22 Feb 2016, 03:57

create path hierarchy ...read each line split and insert tabs

16 Aug 2017, 20:46

Hi,
My apology if not explaining well.
I know ok how to do this looping through directory but I am not sure how to do it reading from a .txt file of paths.

I would like to read each line from text list (will be a directory path, would possibly be created with "everything" search)
So read each line, split by "\", for each folder depth insert tab then folder name.. making it like a hierarchy.

For a simple example I have text file with directory paths:

Code: Select all

\a\b\c
\a\b\c\1\2
\a\b\c\1\3
\d\e\f
So it should look like this:

Code: Select all

a
    b
        c
            1
                2
                3
d
    e
         f
Also sometimes paths would be out of order like:
\a\b\c
\d\e\f
\a\b\c\1

How would I deal with this? Sort t first before executing main code?

Any suggestion is appreciated.
Thank you all
User avatar
jeeswg
Posts: 6902
Joined: 19 Dec 2016, 01:58
Location: UK

Re: create path hierarchy ...read each line split and insert tabs

16 Aug 2017, 21:53

I would recommend people to have a go at both problems, the sorting and the tabulation.

I sort of did the tabulation by intuition rather than thinking, although from tests it appears correct. It was one simple principle, but with one aspect of complication that I used the vIsMatch variable for.

In comments for the functions, I talk about two different sort orders, if there are any standard names for these I would be glad to know. I was tempted to ask on Stack Overflow ... however the rules about acceptable questions there are unclear (and it's easy to get a six-month question ban), so any forum recommendations for forums where you can actually ask sensible reasonable questions about IT, and grow as a programmer, are welcome.

Code: Select all

q:: ;list files in a special tabulated format
vText := " ;continuation section
(
\a\b\c
\a\b\c\1\2
\a\b\c\1\3
\a\b\c\2\2
\a\b\c\2\3
\a\b\d
\a\b\d\1\2
\a\b\d\1\3
\a\b\d\2\2
\a\b\d\2\3
\a\c\d\1\2
\a\c\d\1\3
\a\c\d\2\2
\a\c\d\2\3
\d\e\f
)"

;replace 'if 0' with 'if 1', to use some real paths:
if 0
{
	vText := ""
	VarSetCapacity(vText, 1000000*2)
	vDir1 = %A_Desktop%\New Folder
	vPos := StrLen(vDir1) + 2
	Loop, Files, % vDir1 "\*", FR
		vText .= SubStr(A_LoopFileFullPath, vPos) "`n"
	vText := SubStr(vText, 1, -1)
}

;Sort, vText, F JEE_SortPathFindNextFile
Sort, vText, F JEE_SortPathRegEdit
MsgBox, % vText

vOutput := ""
VarSetCapacity(vOutput, StrLen(vText)*4*2)
oPath2 := {}
Loop, Parse, vText, `n
{
	oPath := StrSplit(A_LoopField, "\")
	vIsMatch := 1
	Loop, % oPath.Length()
	{
		if !vIsMatch || !(oPath[A_Index] = oPath2[A_Index])
			vIsMatch := 0, vOutput .= JEE_StrRept("`t", A_Index-1) oPath[A_Index] "`r`n"
	}
	oPath2 := oPath.Clone()
}

Clipboard := vOutput
oPath := oPath2 := ""
MsgBox, % vOutput
return

;==================================================

JEE_StrRept(vText, vNum)
{
	return StrReplace(Format("{:" vNum "}","")," ",vText)
	;return StrReplace(Format("{:0" vNum "}",0),0,vText)
}

;==================================================

;FindNextFile style, 'finish the current folder':
;a
;b
;a\a
;a\b
;a\a\a
;a\a\b
;a\b\a
;a\b\b
;b\a
;b\b
;b\a\a
;b\a\b
;b\b\a
;b\b\b

JEE_SortPathFindNextFile(vTextA, vTextB, vOffset) ;for use with AHK's Sort command
{
	StringUpper, vTextA, vTextA
	StringUpper, vTextB, vTextB
	if ("" vTextA = "" vTextB)
		return -vOffset

	oTempA := StrSplit(vTextA, "\")
	oTempB := StrSplit(vTextB, "\")
	vMin := oTempA.Length() < oTempB.Length() ? oTempA.Length() : oTempB.Length()

	Loop, % vMin
		if !(oTempA[A_Index] = oTempB[A_Index])
		{
			vTextA := oTempA[A_Index], vTextB := oTempB[A_Index], vIndex := A_Index
			break
		}

	if (vIndex = vMin) && !(oTempA.Length() = oTempB.Length())
		if (oTempA.Length() = vMin)
			return -1
		else if (oTempB.Length() = vMin)
			return 1

	vSCS := A_StringCaseSense
	StringCaseSense, On
	vRet := ("" vTextA) > ("" vTextB) ? 1 : ("" vTextA) < ("" vTextB) ? -1 : -vOffset
	StringCaseSense, % vSCS
	return vRet
}

;==================================================

;RegEdit style, 'move on as soon as possible':
;a
;a\a
;a\a\a
;a\a\b
;a\b
;a\b\a
;a\b\b
;b
;b\a
;b\a\a
;b\a\b
;b\b
;b\b\a
;b\b\b

JEE_SortPathRegEdit(vTextA, vTextB, vOffset) ;for use with AHK's Sort command
{
	StringUpper, vTextA, vTextA
	StringUpper, vTextB, vTextB
	if ("" vTextA = "" vTextB)
		return -vOffset

	oTempA := StrSplit(vTextA, "\")
	oTempB := StrSplit(vTextB, "\")
	vMin := oTempA.Length() < oTempB.Length() ? oTempA.Length() : oTempB.Length()

	Loop, % vMin
		if !(oTempA[A_Index] = oTempB[A_Index])
		{
			vTextA := oTempA[A_Index], vTextB := oTempB[A_Index], vIndex := A_Index
			break
		}

	if (vIndex = vMin) && (vTextA = vTextB)
		if (oTempA.Length() = vMin)
			return -1
		else if (oTempB.Length() = vMin)
			return 1

	vSCS := A_StringCaseSense
	StringCaseSense, On
	vRet := ("" vTextA) > ("" vTextB) ? 1 : ("" vTextA) < ("" vTextB) ? -1 : -vOffset
	StringCaseSense, % vSCS
	return vRet
}

;==================================================
Last edited by jeeswg on 17 Aug 2017, 00:37, edited 2 times in total.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
bish01
Posts: 96
Joined: 22 Feb 2016, 03:57

Re: create path hierarchy ...read each line split and insert tabs

16 Aug 2017, 23:39

Hi jeeswg,
I have not tested it yet but I just want to say thank you in advance as I am online right now.
I highly appreciate your (and anyone's) help.
Cheers again.
wolf_II
Posts: 2688
Joined: 08 Feb 2015, 20:55

Re: create path hierarchy ...read each line split and insert tabs

17 Aug 2017, 03:10

Another attempt, Try this:

Code: Select all

#NoEnv
#SingleInstance, Force

txt =
(
\a\b\c
\a\b\c\1\2
\a\b\c\1\3
\d\e\f
)

Tree := []
Loop, Parse, txt, `n, `r ; line-by-line
    Build(Tree, A_LoopField)
MsgBox, % Output(Tree)

ExitApp



;-------------------------------------------------------------------------------
Build(oTree, Directory) { ; build object with Directory structure
;-------------------------------------------------------------------------------
    Directory := LTrim(Directory, "\")
    BS_Pos := InStr(Directory, "\")
    First := SubStr(Directory, 1, BS_Pos - 1)
    Rest := SubStr(Directory, BS_Pos)

    If BS_Pos {
        If Not oTree.HasKey(First)
            oTree[First] := []
        Build(oTree[First], Rest)
    }

    Else { ; no backslash
        If Not oTree.HasKey(Rest)
            oTree[Rest] := []
    }
}



;-------------------------------------------------------------------------------
Output(oTree, Delim := "") { ; convert tree to desired output
;-------------------------------------------------------------------------------
    For Name, Branch in oTree
        Result .= Delim Name "`n" Output(Branch, Delim "    ")
    Return, Result
}
I hope that helps.
Also sometimes paths would be out of order like:
\a\b\c
\d\e\f
\a\b\c\1
How would I deal with this?
Just run the same script with different txt. No special treatment required.
wolf_II
Posts: 2688
Joined: 08 Feb 2015, 20:55

Re: create path hierarchy ...read each line split and insert tabs

17 Aug 2017, 03:46

I just noticed that in your example you used 4 spaces instead of a tab character (as specified in the thread title),
my attempt matches your example, not the thread title. You can easily fix that, if required.

Code: Select all

replace: "    "
with: "`t"
once near the end of the script.
bish01
Posts: 96
Joined: 22 Feb 2016, 03:57

Re: create path hierarchy ...read each line split and insert tabs

17 Aug 2017, 05:09

thank you wolf_II
I meant tabs but in example I used spaces as every time I clicked on tab key while typing message it would get me out of edit and select something else in firefox...

both of your scripts are great starting point and I will have to study it hard as it is just tad above my skils.
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: create path hierarchy ...read each line split and insert tabs

17 Aug 2017, 15:08

bish01 wrote:thank you wolf_II
I meant tabs but in example I used spaces as every time I clicked on tab key while typing message it would get me out of edit and select something else in firefox...

both of your scripts are great starting point and I will have to study it hard as it is just tad above my skils.
... once you use code-tags, tabs are working fine within the full editor. Just for the records :)
User avatar
AlphaBravo
Posts: 586
Joined: 29 Sep 2013, 22:59

Re: create path hierarchy ...read each line split and insert tabs

17 Aug 2017, 16:27

I remembered doing this long time ago here
modified it a little bit

Code: Select all

data =
(
\a\b\c
\a\b\c\1\2
\a\b\c\1\3
\a\b\c\2\2
\a\b\c\2\3
\a\b\d
\a\b\d\1\2
\a\b\d\1\3
\a\b\d\2\2
\a\b\d\2\3
\a\c\d\1\2
\a\c\d\1\3
\a\c\d\2\2
\a\c\d\2\3
\d\e\f
)

Gui, font, s10
Gui, add, treeview, r30
Gui, show

data := RegExReplace(data, "`am)^\\")
Sort, Data                                                          ; Sort Tree by Great Grandfather
Loop, Parse, data, `n, `r                                           ; read Family Tree one Family at a time
   Loop, Parse, A_LoopField, \                                    	; read the Family one Family Member at a time
    {
        if (A_Index = 1) and (A_LoopField <> Name%A_Index%)         ; if Family Member is a new Great Grandfather
        {
            loop , %Counter%                                        ; loop Family Members count
            {
                Son%A_Index% =                                      ; Reset Family Members' ID's
                Name%A_Index% =                                     ; Reset Family Members' Names
            }
            Parent =                                                ; Reset Current Parent ID
            counter =                                               ; Reset Counter
        }
        
        if ( A_LoopField <> Name%A_Index% )                         ; if Family Member is a new Brother
        {
            Next := A_Index + 1
            Son%Next% =                                             ; Reset Son's ID
            Name%Next% =                                            ; Reset Son's Name
            Son%A_Index% := TV_Add( A_LoopField , Parent, "expand") ; add Son to Parent
			res .= tabs(A_Index-1) . A_LoopField "`n"
        }
        
        Counter ++                                                  ; count the members of the current family
        Name%A_Index% := A_LoopField                                ; save current family member's Name
        Parent := Son%A_Index%                                      ; new generation, c'est la vie
    }
MsgBox % Clipboard := res
return

tabs(n){
	Loop % n
		res .= "`t"
	return res
}
bish01
Posts: 96
Joined: 22 Feb 2016, 03:57

Re: create path hierarchy ...read each line split and insert tabs

18 Aug 2017, 17:15

thank you alphabravo.
I have been searching for wrong terms on google...
bish01
Posts: 96
Joined: 22 Feb 2016, 03:57

Re: create path hierarchy ...read each line split and insert tabs

19 Aug 2017, 07:04

Hi. I had a chance to play with all these example a bit this evening.

I am writing just in case anyone cares to know for another time.

Jeeswg:
Your script worked good on original example, gave me an extra tab at the beginning but not an issue.
However once I plugged my larger list from "everything" scan it blanked my screen, froze the display somehow... I have no idea how that happened. Tried it few times same result.
Also, vOutput was empty at the end ( written file was blank after I appended that var).

wolf_II:
Yours was good but with my other list gave me weird results... stuff misplaced and such hard for me to explain. Maybe I did something weird...
List I used is at the bottom.

AlphaBravo:
No complaints, all good :)

Bobo: Just figured out that tab in edit. I never knew it. Thank you.

Test list...

Code: Select all

C:\Temp\205407_mri_pelvis
C:\Temp\205407_mri_pelvis\DICOM
C:\Temp\205407_mri_pelvis\DICOM\PA000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000002
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000003
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000004
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000005
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000006
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000007
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000008
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000009
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000010
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000011
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000012
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000013
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000014
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000015
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000002
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000003
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000004
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000005
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000006
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000007
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000008
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000009
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000010
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000011
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000012
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000013
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000014
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000015
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000016
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000017
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000018
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000019
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000020
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000021
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000022
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000023
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000024
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000025
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000026
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000027
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000028
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000029
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000030
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000031
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000032
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000033
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000034
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000035
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000036
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000037
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000038
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000039
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000040
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000002
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000003
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000004
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000005
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000006
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000007
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000008
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000009
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000010
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000011
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000012
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000013
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000014
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000015
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000016
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000017
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000018
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000019
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000020
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000021
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000022
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000023
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000024
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000025
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000026
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000027
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000028
C:\Temp\205407_mri_pelvis\DICOMDIR
C:\Temp\205407_mri_pelvis\Viewer
C:\Temp\brush
C:\Temp\scrapbook
C:\Temp\scrapbook_temp
C:\Temp\Win20codecs
C:\Temp\Win20codecs\{542B21EC6D94316E3688}
C:\Temp\Win20codecs\{A6DFA6E24823163AC4F3}
Thank you all again.
User avatar
jeeswg
Posts: 6902
Joined: 19 Dec 2016, 01:58
Location: UK

Re: create path hierarchy ...read each line split and insert tabs

19 Aug 2017, 17:04

If the there was a lot of text to output, you might like to replace:
MsgBox, % vOutput
with
MsgBox, % SubStr(vOutput, 1, 500)
or
MsgBox, % "done"

The extra tab was there because, your paths start with a backslash. So I would replace those leading backslashes as follows:

Code: Select all

vText := StrReplace(vText, "`n\", "`n")
vText := LTrim(vText, "\")
When I tried your example list, my output was fine.

Sometimes if there's a lot of tabs, the output can appear blank in parts, because the text is far to the right.

My apologies if my script caused you any problems, and if there any issues remaining, I'll try to work out what the problem is.

I've have worried in the past what would happen if you pass a huge variable to MsgBox, I'm not sure if it causes any problems, I'll test it now ...

==================================================

[EDIT:]

Code: Select all

q::
vText := "abcdefghij"
vNum := 100000
vOutput := StrReplace(Format("{:" vNum "}","")," ",vText)
MsgBox, % vOutput
return

w::
ControlGetText, vText, Static1, A
MsgBox, % StrLen(vText)
return
MsgBox with a large variable doesn't cause any problems. I tested with 1 million characters, the length of text in the Static control was 8191 characters.
Last edited by jeeswg on 21 Aug 2017, 17:15, edited 1 time in total.
homepage | tutorials | wish list | fun threads | donate
WARNING: copy your posts/messages before hitting Submit as you may lose them due to CAPTCHA
wolf_II
Posts: 2688
Joined: 08 Feb 2015, 20:55

Re: create path hierarchy ...read each line split and insert tabs

19 Aug 2017, 17:44

@bish01: Thanks for your feedback, here is my bugfixed/bugreduced attempt #2:

Code: Select all

; https://autohotkey.com/boards/viewtopic.php?p=165380#p165380
; attempt #2 by wolf_II

#NoEnv
#SingleInstance, Force

txt =
(
C:\Temp\205407_mri_pelvis
C:\Temp\205407_mri_pelvis\DICOM
C:\Temp\205407_mri_pelvis\DICOM\PA000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000002
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000003
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000004
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000005
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000006
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000007
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000008
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000009
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000010
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000011
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000012
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000013
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000014
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000001\IM000015
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000002
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000003
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000004
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000005
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000006
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000007
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000008
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000009
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000010
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000011
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000012
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000013
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000014
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000015
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000016
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000017
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000018
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000019
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000020
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000021
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000022
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000023
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000024
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000025
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000026
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000027
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000028
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000029
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000030
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000031
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000032
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000033
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000034
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000035
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000036
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000037
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000038
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000039
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000002\IM000040
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000001
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000002
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000003
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000004
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000005
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000006
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000007
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000008
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000009
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000010
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000011
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000012
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000013
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000014
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000015
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000016
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000017
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000018
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000019
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000020
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000021
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000022
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000023
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000024
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000025
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000026
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000027
C:\Temp\205407_mri_pelvis\DICOM\PA000001\ST000001\SE000003\IM000028
C:\Temp\205407_mri_pelvis\DICOMDIR
C:\Temp\205407_mri_pelvis\Viewer
C:\Temp\brush
C:\Temp\scrapbook
C:\Temp\scrapbook_temp
C:\Temp\Win20codecs
C:\Temp\Win20codecs\{542B21EC6D94316E3688}
C:\Temp\Win20codecs\{A6DFA6E24823163AC4F3}

)

Tree := []
Loop, Parse, txt, `n, `r ; line-by-line
    Build(Tree, A_LoopField)
Clipboard := Output(Tree)
MsgBox, Result copied to clipboard
ExitApp



;-------------------------------------------------------------------------------
Build(oTree, Directory) { ; build object with Directory structure
;-------------------------------------------------------------------------------
    If !Folder := LTrim(Directory, "\")
        Return

    If BS_Pos := InStr(Folder, "\") {
        First := SubStr(Folder, 1, BS_Pos - 1)
        Rest := SubStr(Folder, BS_Pos)
        If !oTree[First]
            oTree[First] := []
        Build(oTree[First], Rest)
    }

    Else { ; no backslash
        If !oTree[Folder]
            oTree[Folder] := []
    }
}



;-------------------------------------------------------------------------------
Output(oTree, Delim := "") { ; convert tree to desired output
;-------------------------------------------------------------------------------
    For Name, Branch in oTree
        Result .= Delim Name "`n" Output(Branch, Delim "`t")
    Return, Result
}
bish01
Posts: 96
Joined: 22 Feb 2016, 03:57

Re: create path hierarchy ...read each line split and insert tabs

19 Aug 2017, 19:36

Thanks Wolf, that works great.

Jeeswg, sorry, I made a mistake when testing.
Instead of your vOutput var I was using wolf's Output(Tree) var to append to text file. So no wonder it was coming out blank. All good now.

Cheers all.

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: Exies, Google [Bot], JoeWinograd, mikeyww and 122 guests