Macro code to Copy/Paste from one open file to another?
-
@TSquared said in Macro code to Copy/Paste from one open file to another?:
There are thousands of blocks to copy from a single file
A slightly different way to look at this is, given you already have the ability to mark start and ends, and to also select using start and end bookmarks, could you not then bookmark ALL the lines in that selection.
Than select all non-bookmarked lines and delete those leaving just the ones you want and then save that to the filename you want.
Of course the original file becomes sacrificial using this idea so you would need to keep the ORIGINAL elsewhere and work on a copy only.
Terry
-
@Terry-R said in Macro code to Copy/Paste from one open file to another?:
could you not then bookmark ALL the lines in that selection
How does one bookmark all lines in a selection? Sure, one could do it manually, but if the number of lines is large it doesn’t make sense.
The “mark” feature can bookmark multiple lines between two (potentially far apart) points in a file, but it would have to be used with regular expressions (not for everyone) and there would have to be a unique pattern to the ending point (starting point could be “at caret”). Again, it might be too burdensome to the OP to craft something for this ending pattern.
I get the feeling this (what the OP described doing) is a very manual process, but one that works well for the OP…just not where multiple files are concerned.
Of course, though, Terry may give the solution, although it needn’t involve bookmarks: Make a copy of the original file and then manually delete the undesired text from the copy.
-
@Alan-Kilborn said in Macro code to Copy/Paste from one open file to another?:
How does one bookmark all required lines in a selection?
Sorry I hadn’t given a lot of detail as the OP was just asking for suggestions. There are possibly 2 ways I can initially see. First the OP may be able to alter their selection process somewhat so that they can bookmark all lines during their process.
Another method I see (which I just tested to confirm is), once the selection using begin/end select has taken place (all lines between start and end bookmarks are highlighted, use the “Mark” function again and just type in the find window a single . (dot/period) and select bookmark lines. Running that using the “on selection” will bookmark all lines in the selection.
The 3rd alternative is a complete rehash of the process the OP currently has to use my “sacrificial” file approach and design the regexes to remove ALL unwanted lines. whether this is more doable I don’t know as no detail on the type of data is given.
Terry
-
sorry for confusion, I thought you already bookmarked each line of the block you want to copy
but it looks like you marked only start and end of the blocks. -
@Terry-R and others:
Thanks so much for the input. This helps.
Perhaps more info would help.Source File is 3.5+ million lines, in which are 1,000’s of blocks of varying lengths, all starting & ending with text lines that include “BREAK THROUGH @ WT.”
(so far, anyway) I bookmark all lines with that phrase. The macro jumps from bookmark to bookmark, using “Begin/End Select” to select an entire block, using the following code:
<Macro name="Test_Next_BookMark" Ctrl="no" Alt="yes" Shift="no" Key="97"> <Action type="2" message="0" wParam="43006" lParam="0" sParam="" /> <Action type="2" message="0" wParam="42020" lParam="0" sParam="" /> <Action type="2" message="0" wParam="43006" lParam="0" sParam="" /> <Action type="0" message="2300" wParam="0" lParam="0" sParam="" /> <Action type="2" message="0" wParam="42020" lParam="0" sParam="" /> <Action type="2" message="0" wParam="42002" lParam="0" sParam="" /> </Macro>
(image below is the bottom of one selected block).
Similar to @Terry-R, I’d thought of marking all the selected lines, then deleting everything not marked. Unfortunately “Mark All” doesn’t cover the entire selection (it missed 16+ lines in the image above). There can be >100 lines in one block, so I assume there’s a character or line limit. Blocks vary in length, so I can’t specify a number of lines to mark.
If there’s some way to automate marking all the lines in a selection, I actually like the delete-everything-but-what-I-want technique, as it avoids involving a second file.
I hope the extra info helps, and thanks again for all the input.
-
I have great luck with your scenario when I do the following bookmarking operation, even when there is ~1000 lines (it’s what I tried anyway) in the block:
If you want to try exactly that, here’s some copyable text:
(?s)BREAK THROUGH @ WT.*?BREAK THROUGH @ WT
Note that I didn’t use
END
for the trailing text matching, as it isn’t strictly necessary, but it could be added and should also work.The key to this technique is the new feature in N++ 7.8 which will bookmark each and every line making up the marking match. Previously, only the first line of a multiline match would receive the bookmarking, although the entire match would receive the red color.
After you bookmark the text this way, use the feature to copy bookmarked lines to the clipboard for pasting elsewhere.
-
@TSquared said in Macro code to Copy/Paste from one open file to another?:
Unfortunately “Mark All” doesn’t cover the entire selection (it missed 16+ lines in the image above)
Curious, what was the expression you used to do this marking? There must be a reasonable explanation to why it stopped at that point…
And why is it colored in the Style #1 color (cyan)? I would have expected a reddish color, although I freely admit all of these colors can be changed from their defaults…
I actually like the delete-everything-but-what-I-want technique, as it avoids involving a second file.
This should be doable with the technique of the previous post, with application of the “inverting” of bookmarked lines command (see Search menu, Bookmark section). Or, changing the search expression used to do the marking…probably use the
END
text for that one… -
Hello, @tsquared, @ekopalypse, @alan-kilborn, @terry-r and All,
Have you seen this difference, between N++ versions up to
v7.71
and fromv7.8
, while marking lines in the Find dialog ?For instance, using the N++
v7.7.1
version :-
Open the change.log. file
-
Open the Mark dialog (
Search > Mark...
) -
SEARCH
(?s).+
-
Tick the
Bookmark line
option -
Tick the
Purge for each search
option -
Tick the
Wrap around
option -
Select the
Regular expression
search mode -
Click on the
Mark All
button
=> All non-empty lines are highlighted in red but, only the very first line is bookmarked !
Now, using the N++
v7.8
orv7.8.1
versions :- Do the same steps as above
=> As in the
v7.7.1
version, all non-empty lines are highlighted in red but, this time, all the lines are highlighted ! It’s a very helpful improvement ! No need, anymore, to use the\K
regex syntax to match, for instance, a line with a specific criteria and its next l ine, too ;-))
If we apply this improvement, to @Tsquared problem, it can be solved, elegantly !
Let consider the input text, below containing
3
zones of5
lines, to be pasted in an other file :This is a small test line to be ignored This is a small test line to be ignored This is a small test line to be ignored START BREAK THROUGH @ WT This is a small test line 01 to be pasted This is a small test line 02 to be pasted This is a small test line 03 to be pasted This is a small test line 04 to be pasted This is a small test line 05 to be pasted END BREAK THROUGH @ WT This is a small test line to be ignored This is a small test line to be ignored This is a small test line to be ignored START BREAK THROUGH @ WT This is a small test line 06 to be pasted This is a small test line 07 to be pasted This is a small test line 08 to be pasted This is a small test line 09 to be pasted This is a small test line 10 to be pasted END BREAK THROUGH @ WT This is a small test line to be ignored This is a small test line to be ignored This is a small test line to be ignored START BREAK THROUGH @ WT This is a small test line 11 to be pasted This is a small test line 12 to be pasted This is a small test line 13 to be pasted This is a small test line 14 to be pasted This is a small test line 15 to be pasted END BREAK THROUGH @ WT This is a small test line to be ignored This is a small test line to be ignored This is a small test line to be ignored
Let’s use the following regex S/R :
-
Open the Mark dialog (
Search > Mark...
) -
SEARCH
(?s-i)^START BREAK THROUGH @ WT.+?(?=^END BREAK THROUGH @ WT)
-
Tick the
Bookmark line
option -
Tick the
Purge for each search
option -
Tick the
Wrap around
option -
Select the
Regular expression
search mode -
Click on the
Mark All
button
=> You should get the text, below, with some bookmarked lines ( noted with a
●
character, at their beginning ) :This is a small test line to be ignored This is a small test line to be ignored This is a small test line to be ignored ●START BREAK THROUGH @ WT ●This is a small test line 01 to be pasted ●This is a small test line 02 to be pasted ●This is a small test line 03 to be pasted ●This is a small test line 04 to be pasted ●This is a small test line 05 to be pasted END BREAK THROUGH @ WT This is a small test line to be ignored This is a small test line to be ignored This is a small test line to be ignored ●START BREAK THROUGH @ WT ●This is a small test line 06 to be pasted ●This is a small test line 07 to be pasted ● ●This is a small test line 08 to be pasted ●This is a small test line 09 to be pasted ●This is a small test line 10 to be pasted END BREAK THROUGH @ WT This is a small test line to be ignored This is a small test line to be ignored This is a small test line to be ignored ●START BREAK THROUGH @ WT ●This is a small test line 11 to be pasted ●This is a small test line 12 to be pasted ●This is a small test line 13 to be pasted ●This is a small test line 14 to be pasted ●This is a small test line 15 to be pasted END BREAK THROUGH @ WT This is a small test line to be ignored This is a small test line to be ignored This is a small test line to be ignored
Now, simply :
-
Use the N++ command
Search > Bookmark > Copy Bookmarked Lines
-
Switch to your other file or open a new file (
Ctrl + N
) -
Paste all the bookmarked lines , in right order, with the command
Edit > Paste
(Ctrl + V
)
And you’ll get the expected text :
START BREAK THROUGH @ WT This is a small test line 01 to be pasted This is a small test line 02 to be pasted This is a small test line 03 to be pasted This is a small test line 04 to be pasted This is a small test line 05 to be pasted START BREAK THROUGH @ WT This is a small test line 06 to be pasted This is a small test line 07 to be pasted This is a small test line 08 to be pasted This is a small test line 09 to be pasted This is a small test line 10 to be pasted START BREAK THROUGH @ WT This is a small test line 11 to be pasted This is a small test line 12 to be pasted This is a small test line 13 to be pasted This is a small test line 14 to be pasted This is a small test line 15 to be pasted
Note the different copied zones are still separated with the line
START BREAK THROUGH @ WT
. If, in addition, you don’t need them, the regex S/R, below, will delete all !SEARCH
^START BREAK THROUGH @ WT\R
REPLACE
Leave EMPTY
Best Regards,
guy038
-
-
@guy038, @alan-kilborn, and All,
Thanks SO MUCH for what seems parallel evolution of an elegant solution.
Sorry it’s taken me so long to respond: I’ve been hard at work applying your solution. This results in another challenge: When I choose “Copy bookmarked lines,” N++ freezes. I blame it on the large file size - 3.5 million lines, including 5300+ bookmarked lines. If I break it into 3 “smaller” files and bookmark/copy from each of them (so 1500-some bookmarked lines) N++ will freeze for roughly 20 minutes while it copies. Once copied then it’s easy/quick to paste in a separate file.
Any recommendations for speeding up the copying, or otherwise avoiding the slow-down? -
@TSquared said in Macro code to Copy/Paste from one open file to another?:
Any recommendations for speeding up the copying, or otherwise avoiding the slow-down?
Move to a full-fledged programming language, which will allow you to grab the source line-by-line, and decide based on your logic whether it should be output to the new file or not. This will prevent the need for huge copy-paste buffers, or for even having the whole original file in memory.
-
Hi, @tsquared, @ekopalypse, @alan-kilborn, @terry-r and All,
Ah, OK : You’ve got some trouble because of the huge file size :-((
So, instead of trying to bookmark some lines and select bunches of lines, here is a method which just get rid of any single unwanted line !. May be, it’ll be quicker !
First, some assumptions :
-
No pure blank lines or lines with blank characters only occur in your file ( Important )
-
The blocks to keep start with the line
START BREAK THROUGH @ WT
, with that exact case, possibly preceded with some blank characters -
The blocks to keep end with the line
END BREAK THROUGH @ WT
, with that exact case, possibly preceded with some blank characters -
You’ll have to find out a dummy character, used as a temporary symbol, for correct execution of the different regexes. To that purpose, open the Find dialog and type in any single symbol, in the Find what: zone. If a click, on the
Count
button, produces the messageCount : 0 match
, this symbol can be used :-) As for me, I chose the#
symbol
Let’s begin :
-
First, run the
Edit > Line Operations > Remove Empty Lines ( Containing Blank characters )
option -
Add a
pure blank
line on the very beginning of your file -
Place the caret ( cursor ) on that
empty
line, beginning your file ( Important ) -
Perform this first regex S/R, which adds a
#
char at the end of theStart header
line and at the end of all lines to be kept :-
SEARCH
(?-is)(?:^(\h*START BREAK THROUGH @ WT)(\R)|\G)((?:(?!END BREAK THROUGH @ WT).)+)(\R)
-
REPLACE
(?1\1#\2)\3#\4
-
-
Then, perform this second regex S/R, which simply add a
#
symbol at the end of theEnd header
line-
SEARCH
(?-i)^\h*END BREAK THROUGH @ WT
-
REPLACE
$0#
-
-
Finally, run this third regex S/R, which should delete any line which does not end with the
#
symbol, as well as the#
symbol, itself, on lines to be kept-
SEARCH
(?-s)^.+[^#\r\n]\R|#
-
REPLACE
Leave EMPTY
-
Hope this helps you to modify your file more easily !
Best Regards,
guy038
P.S. :
I now realize that, after execution of the third regex S/R, any line
START BREAK THROUGH @ WT
is preceded with a lineEND BREAK THROUGH @ WT
, so may be this End header line is useless for correct identification of the different sectionsIn that case, just don’t run the second regex S/R and all the End header lines will be deleted as well ;-))
-