User to user discussion and support for UltraEdit, UEStudio, UltraCompare, and other IDM applications.

Help with writing and playing macros
5 posts Page 1 of 1
I have a macro that joins lines on massive (50 MB) mainframe files. All I get when I run my macro is the Cancel Operation window and a circling cursor. Anyone know how to add a progress bar to this operation?
All available UltraEdit macro commands are listed in help of UltraEdit on page Edit Macro command which can be opened by pressing on button Help in Edit/Create Macro dialog or pressing key F1 with this dialog open. The macro commands are also documented in my macro reference file. That's it. So a progress bar is not available.

I'm wondering about the requirement for a progress bar for joining lines in a file with a medium size of 50 MB. A regular expression Replace All can do that most likely in less than 10 seconds. I suppose you use a not so smart method which requires lots of display updates because of caret moving and recording lots of undo steps. You should think about changing the method to get the result you want. We can help on macro development if you post a block showing us file contents before macro execution (input data), another block with the expected result (output data), and explaining what are the criteria to get from input to output data.
Best regards from Austria
Hi, sorry for the delay - I've been on the road the last couple of weeks.

Thanks for your kind offer. Here's is what I have:

13 lines of data:

Code: Select all
1XXXXX
2XXXXX
3XXXXX
4XXXXX
5XXXXX
6XXXXX
7XXXXX
8XXXXX
9XXXXX
10XXXX
11XXXX
12XXXX
13XXXX

that I want to make into one line:

Code: Select all
1XXXXX2XXXXX3XXXXX4XXXXX5XXXXX6XXXXX7XXXXX8XXXXX9XXXXX10XXXX11XXXX12XXXX13XXXX

Here's the macro I am using:

Code: Select all
InsertMode
ColumnModeOff
HexOff
Key DOWN ARROW
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME
Key BACKSPACE
Key DOWN ARROW
Key HOME

Any help you can provide is greatly appreciated.

Siegfried
This can be done much faster with two Perl regular expression using backreferences Replace All.

Code: Select all
InsertMode
ColumnModeOff
HexOff
Top
PerlReOn
Find MatchCase RegExp "^(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)((?:.*(?:\r?\n|\r)){5})"
Replace All "\1\2\3\4\5\6\7\8\9"
Top
Find MatchCase RegExp "^(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)(.*)(?:\r?\n|\r)(.*)"
Replace All "\1\2\3\4\5"
Top

If the line terminator type is always DOS/Windows, the search strings can be simplified:

Code: Select all
InsertMode
ColumnModeOff
HexOff
Top
PerlReOn
Find MatchCase RegExp "^(.*)\r\n(.*)\r\n(.*)\r\n(.*)\r\n(.*)\r\n(.*)\r\n(.*)\r\n(.*)\r\n((?:.*\r\n){5})"
Replace All "\1\2\3\4\5\6\7\8\9"
Top
Find MatchCase RegExp "^(.*)\r\n(.*)\r\n(.*)\r\n(.*)\r\n(.*)"
Replace All "\1\2\3\4\5"
Top

(...) is a marking/capturing group. The string found by the expression inside this group can be back referenced with \1 to \9. 9 is the maximum for capturing groups which is the reason why 2 replaces are necessary for joining 13 lines to 1 line.

(?:...) is a non marking/non capturing group as used in first macro for DOS/UNIX OR MAC line termination and in both macros to apply multiplier {5} (exactly 5 times) to a non marking group finding a single line with line termination put into a marking group.

The last line of the file must have also a line termination for this macro. It would be possible to change the expression to work also for last line of file independent on existence of a line termination and end of file.

Example input data used for testing:

Code: Select all
1XXXXX
2XXXXX
3XXXXX
4XXXXX
5XXXXX
6XXXXX
7XXXXX
8XXXXX
9XXXXX
10XXXX
11XXXX
12XXXX
13XXXX
1YYYYY
2YYYYY
3YYYYY
4YYYYY
5YYYYY
6YYYYY
7YYYYY
8YYYYY
9YYYYY
10YYYY
11YYYY
12YYYY
13YYYY
1ZZZZZ
2ZZZZZ
3ZZZZZ
4ZZZZZ
5ZZZZZ
6ZZZZZ
7ZZZZZ
8ZZZZZ
9ZZZZZ
10ZZZZ
11ZZZZ
12ZZZZ
13ZZZZ

Modified with first Replace All to:

Code: Select all
1XXXXX2XXXXX3XXXXX4XXXXX5XXXXX6XXXXX7XXXXX8XXXXX9XXXXX
10XXXX
11XXXX
12XXXX
13XXXX
1YYYYY2YYYYY3YYYYY4YYYYY5YYYYY6YYYYY7YYYYY8YYYYY9YYYYY
10YYYY
11YYYY
12YYYY
13YYYY
1ZZZZZ2ZZZZZ3ZZZZZ4ZZZZZ5ZZZZZ6ZZZZZ7ZZZZZ8ZZZZZ9ZZZZZ
10ZZZZ
11ZZZZ
12ZZZZ
13ZZZZ

Final output for the example after macro finished:

Code: Select all
1XXXXX2XXXXX3XXXXX4XXXXX5XXXXX6XXXXX7XXXXX8XXXXX9XXXXX10XXXX11XXXX12XXXX13XXXX
1YYYYY2YYYYY3YYYYY4YYYYY5YYYYY6YYYYY7YYYYY8YYYYY9YYYYY10YYYY11YYYY12YYYY13YYYY
1ZZZZZ2ZZZZZ3ZZZZZ4ZZZZZ5ZZZZZ6ZZZZZ7ZZZZZ8ZZZZZ9ZZZZZ10ZZZZ11ZZZZ12ZZZZ13ZZZZ
Best regards from Austria
Wow! This works perfectly and is very fast.

Many thanks for putting this together for me.

Vielen dank!

Siegfried
5 posts Page 1 of 1