• Login
Community
  • Login

Find&Replace in one column

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
7 Posts 3 Posters 5.1k 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.
  • G
    Gergely Apró
    last edited by Dec 27, 2020, 10:20 AM

    I have a large text file with lots of lines, each lines representing info on one thing, in specific order, in this format:
    Steve|18|male|Germany…
    Rose|40|female|England…
    Mary|29|female|France…
    …

    Lets say, I want to replace all occurence of Steve with Stephan in the first column for whatever reason. First I make notepad sparate the file into actual colums using TextFX. Then I select the first column using Alt-Shift-leftclick or Begin/End Select. So I have the first column selected already. Then I go to Find&Replace and it has this small box called Replace only in selected text, which I need to check in for my plan to work, however it does not allow me to do so. What can I do?

    Sidenote: Don’t suggest any drastically different solution. Steve may appear anywhere in the text and if I do something just a little bit wrongly, it’d also get replaced and I wouldn’t even know about it, but I only want to replace it in that one column.

    A 1 Reply Last reply Dec 27, 2020, 11:52 AM Reply Quote 0
    • A
      astrosofista @Gergely Apró
      last edited by Dec 27, 2020, 11:52 AM

      Hi @Gergely-Apró

      Yes, the Find&Replace feature doesn’t work on rectangular selections.

      Despite your sidenote, I will suggest you a regex approach in order to get the following: replace all the Steve appearances as long as they are placed between the start of the line (^) and the first pipe (|) :

      Search: (?-s)^(Steve)(?=\|)
      Replace: Stephan
      

      Put the caret at the very beginning of the document, select just the Regular Expressions mode and click on Replace All.

      Given the following data

      Steve|18|male|Germany…
      Rose|40|female|England…
      Mary|29|female|France…
      Rose|40|female|Steve
      Steve|18|male|Germany…
      Mary|29|Steve|France…
      

      the outcome of the regex replacement is

      Stephan|18|male|Germany…
      Rose|40|female|England…
      Mary|29|female|France…
      Rose|40|female|Steve
      Stephan|18|male|Germany…
      Mary|29|Steve|France…
      

      Please note that the Steve string at lines four and six wasn’t replaced.

      Have fun!

      1 Reply Last reply Reply Quote 3
      • G
        Gergely Apró
        last edited by Gergely Apró Dec 27, 2020, 2:06 PM Dec 27, 2020, 2:03 PM

        I’ll test that but I’d still prefer if I could make it work my way somehow

        A 1 Reply Last reply Dec 27, 2020, 2:11 PM Reply Quote 0
        • A
          Alan Kilborn @Gergely Apró
          last edited by Dec 27, 2020, 2:11 PM

          @Gergely-Apró said in Find&Replace in one column:

          Don’t suggest any drastically different solution.

          I’d still prefer if I could make it work my way somehow

          Hmmm, I think it is the difference between “not being able to do something at all” and perhaps “learning a bit of something about how you can easily do it”. Are you paralyzed with fear about that second choice?

          I’d point out that the “easy” way doesn’t require bastardizing your data with an obsolete plugin (TextFX) first (which gets you nowhere anyway).

          G 1 Reply Last reply Dec 27, 2020, 5:40 PM Reply Quote 0
          • G
            Gergely Apró @Alan Kilborn
            last edited by Dec 27, 2020, 5:40 PM

            @Alan-Kilborn I understand, I’m usually not this much against new stuff, but I’ve been working on something for 9 months now, little by little, and when I started I had zero knowledge about what I’m doing. I actually still don’t really know. So every minor thing that didn’t work, no matter how trivial it was to solve it, took me a week to figure out, and brought me closer to this attitude.

            I’ve also been told a few times that the way I am doing it is inefficient, but at least it works. Why I use textFX? To visible divide my text into columns. Which allows me to select a column. After which I can move the column elsewhere or try to do Find&replace in it (didn’t know it won’t work). Is there a better/easier/faster way to do it? Maybe, but after such a long time, I got tired of looking for the best alternative for everything.

            A 1 Reply Last reply Dec 27, 2020, 8:48 PM Reply Quote 0
            • A
              Alan Kilborn @Gergely Apró
              last edited by Dec 27, 2020, 8:48 PM

              @Gergely-Apró

              Well, I certainly don’t advocate agonizing over what’s “best”.
              I suppose with experience (even a little), things either start to feel “right” or maybe “heavy”.
              Thus, you keep the “right” ones and discard the “heavy”.

              I am certainly sorry that Notepad++ can’t do a “column” find/replace.
              It is only very recently that it got the ability to find text in a stream (non-column) selection!

              I’m hesitant to bring this up, but for myself, I’ve been doing column-block replacements using Notepad++ for a long time, maybe years. How do I do this? Well, I have a scripting plugin, and I have written a script to do it. Yes, yes, I know, that overwhelms you, but I’ll show the technique and maybe it benefits someone else.

              First, we use the Pythonscript plugin, and write some Python code to create a function that, when called, can replace text in a column block (or a regular block, or several regular blocks (called multi-selection):

              # -*- coding: utf-8 -*-
              
              from Npp import notepad, editor
              
              def editor_rereplace(editor_x, find_what, replace_with, ignore_case_flag=0, max_count=0, start_end_pos_tup=None):
                  # if start_end_pos_tup is None, replace will be done in all active selections
                  leave_caret_pos = editor_x.getAnchor()
                  if editor_x.getCurrentPos() < leave_caret_pos: leave_caret_pos = editor_x.getCurrentPos()
                  start_end_pos_tup_list = []
                  if start_end_pos_tup == None:
                      if editor_x.getSelectionEmpty():
                          start_end_pos_tup_list.append((0, editor_x.getTextLength()))
                      else:
                          for n in range(editor_x.getSelections()):
                              (s, e) = (editor_x.getSelectionNStart(n), editor_x.getSelectionNEnd(n))
                              if s != e:
                                  if s < leave_caret_pos: leave_caret_pos = s
                                  start_end_pos_tup_list.append((s, e))
                  else:
                      start_end_pos_tup_list.append(start_end_pos_tup)
                  start_end_pos_tup_list.reverse()  # process data closest to bottom first to avoid messing with earlier match positions
                  for (s, e) in start_end_pos_tup_list: editor_x.rereplace(find_what, replace_with, ignore_case_flag, s, e, max_count)
                  editor_x.setEmptySelection(leave_caret_pos)  # active selection(s) after replace can be wacky, so..
                  editor_x.scrollCaret()
              

              Next, we create some code that calls this function, which in this case is your typical “what do you want to find, what do you want to replace it with” type stuff:

              findwhat = notepad.prompt('Enter find string:', '', '')
              if findwhat != None and len(findwhat) > 0:
                  replacewith = notepad.prompt('Enter replace string:', '', '')
                  if replacewith != None and len(replacewith) > 0:
                      editor.beginUndoAction()
                      editor_rereplace(editor, findwhat, replacewith)
                      editor.endUndoAction()
              

              This script, when run, prompts thusly:

              0fd82223-3d13-4d38-9a81-53d817ebfcf4-image.png

              After typing some text to search for and clicking OK, it prompts this way:

              3070e589-4bf2-40f5-b711-b1ff858cd239-image.png

              After some text is entered and OK is pressed, the script goes on to replace text, in the selected area, be it any type of selection (or the whole document if no selection was active when run).

              1 Reply Last reply Reply Quote 2
              • A
                Alan Kilborn
                last edited by Alan Kilborn Dec 28, 2020, 3:01 PM Dec 28, 2020, 3:01 PM

                FWIW, some related items:

                • https://community.notepad-plus-plus.org/topic/14644/replacement-in-vertical-block

                • https://community.notepad-plus-plus.org/topic/15606/how-to-replace-in-block-mode

                • https://github.com/notepad-plus-plus/notepad-plus-plus/issues/5113

                1 Reply Last reply Reply Quote 0
                • A Alan Kilborn referenced this topic on Nov 29, 2021, 1:16 PM
                6 out of 7
                • First post
                  6/7
                  Last post
                The Community of users of the Notepad++ text editor.
                Powered by NodeBB | Contributors