Community
    • Login

    Combine 2 texts line by line

    Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
    17 Posts 7 Posters 21.9k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • guy038G
      guy038
      last edited by

      Hi, @honorata-Wisniewski, @scott-sumner and All,

      Oooooups ! I’ve just realized that my previous results are not exactly what Honorata would like to ! So, here is my second attempt :

      So, let’s use, again, the example text :

      Beginning of Line 1
      Beginning of Line 2
      
      Beginning of Line 4
      Beginning of Line 5
      Beginning of Line 6
      Beginning of Line 7
      
      Beginning of Line 9
      ~~~~~~~~~~~~~~~~~~~~
      End of Line 1
      End of Line 2
      End of Line 3
      
      End of Line 5
      End of Line 6
      
      End of Line 8
      End of Line 9
      

      So, AFTER the following regex S/R :

      SEARCH : (?s)^~~~.+|(?-s)^.*\R(?=(?:.*\R){9}(^.*\R))

      REPLACE : ?1$0\1

      You’ll get, this time, the expected text, below :

      Beginning of Line 1
      End of Line 1
      Beginning of Line 2
      End of Line 2
      
      End of Line 3
      Beginning of Line 4
      
      Beginning of Line 5
      End of Line 5
      Beginning of Line 6
      End of Line 6
      Beginning of Line 7
      
      
      End of Line 8
      Beginning of Line 9
      End of Line 9
      

      Cheers,

      guy038

      1 Reply Last reply Reply Quote 3
      • Honorata WisniewskiH
        Honorata Wisniewski
        last edited by

        @guy038 said:

        (?s)^~~~.+|(?-s)^.\R(?=(?:.\R){9}(^.*\R))

        Thank you! It also works!
        But there is a little nuance here. Number of lines (in your example) shall be equal 20 (not 19). Line 20 can be empty
        Otherwise the last line “End of Line 9” disappear

        Claudia FrankC 1 Reply Last reply Reply Quote 1
        • guy038G
          guy038
          last edited by guy038

          Hi, @honorata-Wisniewski and All,

          Ah yes, I forgot to point out that the last line, of the new tab contents ( The End of line 9 in our example ) must be followed by a line-break. If you choose the menu option View > Show Symbol > Show all characters, the last line should be displayed as End of line 9CRLF ( or End of line 9LF, for Unix files ) and not, simply, as End of line 9

          Indeed, if you do not add a line-break ( the regex \R ), the last part of my regex (^.*\R) cannot be matched and, consequently, the overall match, for the last line, because of the lack of the End of Line characters !

          Best Regards,

          guy038

          P.S. :

          • Remenber that the quantifier {9}, in the regexes, represents the exact number of lines of, both File1 and File2

          • The separation line must begin by, at least, the string ~~~, even if the surrounding lines begin with some blank characters

          1 Reply Last reply Reply Quote 2
          • Claudia FrankC
            Claudia Frank @Honorata Wisniewski
            last edited by

            @Honorata-Wisniewski

            just in case you are interested in a python script way of doing it.

            from itertools import izip_longest
            
            # create a list of lines from editor1 
            editor1_list = editor1.getText().split()
            # create a list of lines from editor2
            editor2_list = editor2.getText().split()
            #create the merged list (not really a list but an iterator)
            resulting_list = izip_longest(editor1_list,editor2_list, fillvalue='')
            
            # create new document
            notepad.new()
            # populate the merged list
            editor.setText('\n'.join('\n'.join(x) for x in resulting_list))
            

            If the two documents do have different numbers of lines then this solution adds an empty line.
            Maybe useful (?)

            Cheers
            Claudia

            1 Reply Last reply Reply Quote 1
            • Scott SumnerS
              Scott Sumner
              last edited by

              So I’m not one to try to oversell a solution I come up with, but mine was actually one that I could remember how to do if the need ever arises to do this type of 2-file merge.

              While the regex based solution is cool, elegant, etc., how could one possibly remember it? One could document it or a link (to here) in a file, but then one would have to spend time searching for THAT. Same goes for the Pythonscript; nice, but I’d have to keep track of it…for this very very occasional need.

              My solution did have a regex replacement component. Hard to remember that one? No, for those that are regex-worthy. Yes, for those that are not. So let’s eliminate that part (I’ve decided that the column-selection method I hinted at above is not too hard (to remember)):

              To remove the leading numbers put on in the column-editor step (non-regex version):

              • Move the cursor/caret to the top of the now-interleaved file with Ctrl+Home
              • Invoke Edit (menu) -> Begin/End Select (a shame that this handy command has no default keycombo assigned!)
              • Move the cursor/caret to the bottom of the file with Ctrl+End
              • Move the caret to the LEFT side of the last digit to be removed near the start of the last line
              • Press Shift+Alt+RightArrow so that the last digit to be removed becomes highlighted (note that the addition of Alt to the keycombo makes this one-character selection a “column” selection–important to the next step!
              • Invoke Edit (menu) -> Begin/End Select (all of the line-leading digits to be removed are now highlighted/selected (in a “column selection”
              • Tap the Delete key and BOOM GOES THE DYNAMITE–you are left with only the text you want to end up with–the interleaved files
              1 Reply Last reply Reply Quote 2
              • guy038G
                guy038
                last edited by guy038

                Hi @Scott-sumner,

                Sure that the Edit > Begin/End menu command is interesting when the start of the selection is somewhere, inside the file, but, as we need a rectangular selection from the first digit of the first line, it could be realized even more simply :-)

                So, assuming you have some fixed width digit columns, at beginning of all lines of your file :

                • Move to the very beginning of the file ( Ctrl + Home )

                • Then, drag down the vertical lift, on the right side of the editor window, to get the very end of the file

                • Hold down, simultaneously, the Alt and Shift keys and, at the same time, left click, with the mouse, right after the last digit of the last line

                => A rectangular selection, highlights all the digits, on the left side of the editor window

                • Hit the Delete key, to suppress the numbers

                • Hit the Left Arrow key, to delete the 0 column selection and move back at the very beginning of the file

                Et voilà !


                This post, Scott, give me the opportunity to wish you, all N++ users , contributors and @Don-HO, as well as your families, "O-O-O-O Merry Christmas O-O-O-O" !!!

                Cheers,

                guy038

                Scott SumnerS 1 Reply Last reply Reply Quote 2
                • Scott SumnerS
                  Scott Sumner @guy038
                  last edited by

                  @guy038

                  There are 2 reasons I like to use Begin / End Select with the keyboard instead of the mouse:

                  • When you have a large file, scrolling operations with the mouse take some effort/time; keyboard operations to jump to start of file (Ctrl+Home) and end of file (Ctrl+End) are quick. In fact, Begin/End Select was probably created for keyboard users manipulating larger files.

                  • With the mouse, if you have a smaller font size enabled, it is kind of hard to hit an exact spot with the mouse in a single-click. I find that as I’m also concentrating on doing Shift+Alt while doing it, it makes it slightly harder. With the keyboard I know where I have the cursor/caret before I do the modifier keycombo, so no errant spot-hitting.

                  Of course, it is a personal preference.

                  1 Reply Last reply Reply Quote 2
                  • wonkawillyW
                    wonkawilly
                    last edited by

                    @Honorata-Wisniewski said:

                    Hi all!

                    How can I combine 2 texts (or 2 files) in notepad++ line by line?

                    Thus:
                    1 line from text1 (or file1)
                    1 line from text2 (or file2)
                    2 line from text1 (or file1)
                    2 line from text2 (or file2)
                    …
                    ect?

                    Thanks!

                    I frequently face such a need and I usually do the following (I assure you it is more long to explicate than to do):

                    1. I start by selecting the content of the first file with keyboard or mouse: I select it holding the Alt button on the keyboard to use the built-in N++ column selection mode;
                    2. I copy the selected text (Ctrl+c) to the clipboard;
                    3. Then I go to the second file at the first line;
                    4. Hold Alt+Shift keys and I go with the mouse or the keyboard down arrow to the last row at the EOF. Now I have a multi line keyboard cursor (that is the insertion point) blinking in my file;
                    5. I insert in the whole column previous selected a space-holder char (you can use any char that is not used into your file or even any string like “newlinehere”);
                    6. then I go to the first line, the first char of the row positioning the insert point prior of the space-holder;
                    7. Press Ctrl+v to paste the text from the clipboard;
                    8. Now I set a search for the place-holder and replace with \r\n;
                    9. Done.

                    Here is an animation that clarifies all steps. Unfortunately this community doesn’t accept file upload so I linked the external resource. Enjoy

                    1 Reply Last reply Reply Quote 2
                    • guy038G
                      guy038
                      last edited by

                      Hi, @scott-sumner,

                      I agree with you, that the Begin/End select feature could be useful, dealing with large files !

                      BTW, here is below, my method, slightly different from yours, to combine the Begin/End select feature and the column selection mode :

                      Let’s start with the text, below :

                      1 This a small example text
                      2 to s><how how to do a
                      3 column selection with
                      4 the "Begin/End Sele><ct"
                      5 feature of Notepad++
                      
                      • Left click at the position, between the two symbols ><, in line 2

                      • Execute a Edit > Begin/End Select command

                      • Now, left click at the other position, between the two symbols ><, in line 4

                      Note that it’s the exact location where you want the column selection to be ended !

                      • Hold down, simultaneously, the Alt and Shift keys and then hit the two keys Right Arrow then Left Arrow, to get a 0-column selection

                      • Execute, again, a Edit > Begin/End Select command

                      => The three lines column selection, below, is created :

                      <how how to do 
                      n selection wit
                      Begin/End Sele>
                      

                      Cheers,

                      guy038

                      1 Reply Last reply Reply Quote 2
                      • Scott SumnerS
                        Scott Sumner
                        last edited by Scott Sumner

                        So @wonkawilly 's solution is a good one. It is often forgotten that a column/rectangular selection isn’t really rectangular if some/all of its lines end before they hit the right edge of the block. That is a key point that makes this solution viable.

                        One “problem” with the solution is that it relies on the user to know that the column block to be copied is wide enough to capture the longest line. If there are a lot of lines this becomes problematic as using the Begin / End Select techique discussed earlier is definitely the way to go. But doing so creates uncertainty that the column block defined by the user at the last line of the file is truly wide enough. Maybe a viable solution is to decide that a large number of columns (256?) will cover all situations likely to be encountered.

                        So even better than remembering how to do this technique is recording it as a macro and having it always handy on the Macro menu. I decided to give this a try. I decided to do it as 2 macros. It could be done as one macro with some extra effort…

                        The first macro copies all data (up to 256 columns) in the current file to the clipboard as a column block. It looks like this:

                        <Macro name="Copy All Lines in Column Mode (max. 256 cols.)" Ctrl="no" Alt="no" Shift="no" Key="0">
                            <Action type="0" message="2316" wParam="0" lParam="0" sParam="" />
                            <Action type="2" message="0" wParam="42020" lParam="0" sParam="" />
                            <Action type="0" message="2318" wParam="0" lParam="0" sParam="" />
                        

                        Then REPEAT this line 256 times in the first macro:

                            <Action type="0" message="2429" wParam="0" lParam="0" sParam="" />
                        

                        Then continue with this for the first macro:

                            <Action type="2" message="0" wParam="42020" lParam="0" sParam="" />
                            <Action type="0" message="2178" wParam="0" lParam="0" sParam="" />
                            <Action type="2" message="0" wParam="42002" lParam="0" sParam="" />
                            <Action type="0" message="2345" wParam="0" lParam="0" sParam="" />
                        </Macro>
                        

                        The second macro merges the column-block data in the clipboard into the current file as the file’s new odd-numbered lines. It looks like this:

                        <Macro name="Merge in Col. Block in Clipboard as Odd Numbered Lines" Ctrl="no" Alt="no" Shift="no" Key="0">
                            <Action type="0" message="2316" wParam="0" lParam="0" sParam="" />
                            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
                            <Action type="3" message="1601" wParam="0" lParam="0" sParam="^" />
                            <Action type="3" message="1625" wParam="0" lParam="2" sParam="" />
                            <Action type="3" message="1602" wParam="0" lParam="0" sParam="\xff" />
                            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
                            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
                            <Action type="0" message="2316" wParam="0" lParam="0" sParam="" />
                            <Action type="0" message="2179" wParam="0" lParam="0" sParam="" />
                            <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
                            <Action type="3" message="1601" wParam="0" lParam="0" sParam="\xff" />
                            <Action type="3" message="1625" wParam="0" lParam="2" sParam="" />
                            <Action type="3" message="1602" wParam="0" lParam="0" sParam="\r\n" />
                            <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
                            <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
                            <Action type="0" message="2316" wParam="0" lParam="0" sParam="" />
                        </Macro>
                        

                        I had one problem with recording the macro I originally wanted for the second macro. I was attempting to get a zero-width column mode caret in column 1 for inserting a special character (I used hex FF as that special character) that would be replaced later with \r\n. Unfortunately, what was recorded into the macro for this resulted in only a non-column caret on the last line of the file. I didn’t delve too much into the macro source to see if I could work around this issue; rather I realized that a replace-all operation where one searches for ^ (beginning of line) and replaces that with the desired special character would work equivalently.

                        So an example of this whole thing in action would be:

                        File 1 contents:

                        aaaaaaaaaa
                        bbbbbbbbbbbbbbb
                        cccccccc
                        ddddddddd
                        eeeeeeeeeeeeeee
                        fffffffffffffffff
                        

                        File 2 contents:

                        11111111111111111111111
                        222222
                        3333333
                        444444444444
                        55555555
                        666
                        

                        With File 1 active run the first macro (“Copy All Lines in Column Mode (max. 256 cols.)”).

                        With File 2 active run the second macro (“Merge in Col. Block in Clipboard as Odd Numbered Lines”).

                        File 2 contents after the merge (note File 1 is unchanged):

                        aaaaaaaaaa
                        11111111111111111111111
                        bbbbbbbbbbbbbbb
                        222222
                        cccccccc
                        3333333
                        ddddddddd
                        444444444444
                        eeeeeeeeeeeeeee
                        55555555
                        fffffffffffffffff
                        666
                        
                        1 Reply Last reply Reply Quote 3
                        • PeterJonesP
                          PeterJones
                          last edited by

                          @Fernando-Sorensen made a new post which added an alternate idea; I have linked to it for future readers of this topic, so they don’t miss the separate post.

                          1 Reply Last reply Reply Quote 1
                          • Muppi KarthickM
                            Muppi Karthick @guy038
                            last edited by

                            @guy038 said in Combine 2 texts line by line:

                            (?s)

                            thanks for such a valuable post. its working for me. how to merge 3 files.

                            1 Reply Last reply Reply Quote 0
                            • First post
                              Last post
                            The Community of users of the Notepad++ text editor.
                            Powered by NodeBB | Contributors