如果我尝试在文本文件中创建一个列并使用在文本文件的特定区域中找到的相同值填充该列,我可以使用正则表达式查找/替换以成功执行此操作。由于该列最右边,我找到\r
并替换为,VALUE,\r
,其中VALUE
粘贴在上一个副本中( CTRL - C )命令。问题是我无法将其作为其他文件上的宏工作,因为它记录了 CTRL - V 的值而不是keystroke命令< KBD> CTRL - V 。有没有办法让宏模拟 CTRL - V 而不是填写特定值?
添加信息: 文件中的每一行都需要粘贴的值。原因是因为每一行都包含产品编号和数量。通过能够粘贴其中一个标题中找到的值,我可以将这些行链接到粘贴值表示的顺序。因此,一个表将包含订单号,日期等,而另一个表将包含订单的详细信息,即项目。
这是一个示例文件:
ITEMNAME,ITEMID,QTY STORE#578 PO 0076875422 04-01-2014,SHIPPED
蓝鱼,98799,3
红鱼,48573,10
YELLOW SNAIL,94582,2
GREEN LIZARD-MEDIUM,32451,12
黑色TARANTULA,29879,909
在notepad ++中运行脚本后,此文件将如下所示:
ITEMNAME,ITEMID,QTY STORE#578 PO 0076875422 04-01-2014,SHIPPED,ORDER_NUMBER
蓝鱼,98799,3,,0076875422
红鱼,48573,10,0076875422
YELLOW SNAIL,94582,2,0076875422
GREEN LIZARD-MEDIUM,32451,12,,0076875422
BLACK TARANTULA,29879,909,,0076875422
包含QTY的标题包含其他数据:商店数量,订单数量和订单日期。订单号始终以&#34; PO&#34;开头。它总是10位数。宏需要能够在每个文件中找到它,然后将其添加到每行的末尾,但是需要在逗号前面加上允许SHIPPED列中的空值。当然,您还会注意到标题行已添加到名为ORDER_NUMBER的标题行中。
我遇到的问题是能够将订单号的值粘贴到当前宏中每行b / c的末尾,它只能粘贴记录时粘贴的值,而不是当前正在处理的文件中的实际采购订单编号。所以我想,如果我告诉宏在标题行中找到PO编号并将其复制到剪贴板后,我能以某种方式记录CTRL-V键击,那么它就能工作。
答案 0 :(得分:1)
这是承诺的NppExec脚本。将其保存到脚本名称,然后您可以使用菜单项目名称将其添加到NppExec菜单中(在插件 - &gt; NppExec - &gt;高级选项关联中) 脚本名称到项目名称),重新启动记事本++后,您将在快捷方式映射器中的某处找到此项目名称(在插件选项卡下)并且您可以为其指定键盘快捷键。
npp_exec脚本
// http://www.scintilla.org/ScintillaDoc.html
// http://docs.notepad-plus-plus.org/index.php/Moving_And_Selecting_Around
NPP_CONSOLE OFF
// 1. retrieve to PO:
// 1.1 set the first line as target for the search
SCI_SENDMSG SCI_DOCUMENTSTART
SCI_SENDMSG SCI_LINEDOWN
SCI_SENDMSG SCI_GETCURRENTPOS
set Line1End ~ $(MSG_RESULT) -1
// 1.2 do a RE search for the PO and retrieve the value for later reuse
// set the range for the RE search to the first line
SCI_SENDMSG SCI_SETTARGETSTART 0
SCI_SENDMSG SCI_SETTARGETEND $(Line1End)
SCI_SENDMSG SCI_SETSEARCHFLAGS SCFIND_REGEXP
SCI_SENDMSG SCI_SEARCHINTARGET 11 "PO (\d{10})"
set POPos=$(MSG_RESULT)
if $(POPos) == -1 goto NOTFOUND
// 1.3 get the PO Text:
SCI_SENDMSG SCI_GETTAG 1 @""
set POText=$(MSG_LPARAM)
// 2 append ",ORDER_NUMBER" to first line
SCI_SENDMSG SCI_DOCUMENTSTART
SCI_SENDMSG SCI_LINEEND
SCI_SENDMSG SCI_INSERTTEXT -1 @",ORDER_NUMBER"
// 3 append POText to every other line
SCI_SENDMSG SCI_LINEDOWN
:REPEAT
// 3.1 append ",POText" to line
SCI_SENDMSG SCI_LINEEND
SCI_SENDMSG SCI_INSERTTEXT -1 @",$(POText)"
// 3.2 as long as we have not reached the last line: loop
SCI_SENDMSG SCI_LINEEND
SCI_SENDMSG SCI_GETCURRENTPOS
set pos1 = $(MSG_RESULT)
SCI_SENDMSG SCI_LINEDOWN
SCI_SENDMSG SCI_GETCURRENTPOS
set pos2 = $(MSG_RESULT)
// if the linedown doesnot give another pos, we have reached the end
if $(pos1) == $(pos2) goto END
// else loop
if 1==1 goto REPEAT
:NOTFOUND
NPP_CONSOLE ON
echo "There is no PO in the first line!"
:END
它主要使用NppExec的SCI_SENDMSG
命令来远程控制编辑器。消息的文档位于第一行的链接中。但也存在大量的反复试验。
答案 1 :(得分:1)
以下假设每个文件中只有一个采购订单编号 并且应该在Notepad ++版本6.4.3以后工作:
说明
1) Define a macro `Save PO #` that
a) Finds and saves the PO # to the clipboard
b) Advances to the start of the following line
2) Define a macro `Add PO #` that
a) Adds a comma to the end of a line then pastes the clipboard
b) Advances to the next line
3) For each file
a) Run macro `Save PO #`
b) Run macro `Add PO #` to `end of file`
方法
1)Start recording
Ctrl+Home
Find
找到:PO
Find Next
Alt+F4
Right
Edit
Begin/End Select
Find
找到:
Find Next
Alt+F4
Left
Edit
Begin/End Select
Ctrl+C
End
Right
Stop recording
Save current recorded macro
姓名:Save PO #
OK
2)Start recording
End
,
Ctrl+V
Right
Stop recording
Save current recorded macro
姓名:Add PO #
OK
3)打开文件进行编辑
Macro
Save PO #
Run a Macro Multiple Times
要运行的宏:Add PO #
Run until end of file
Run
答案 2 :(得分:0)
由于NPPExec脚本太慢,这是另一个纯Notepad ++解决方案:
正则表达式查找/替换如下:
(PO (\d{10})[^\r\n]+\R(.*\2\R)*+)([^\r\n]+)(\R)
\1\4,\2\5
,ORDER_NUMBER
附加到第一行一个先决条件是最后一行在其末尾有一个换行符,这意味着您必须在最后一行手动添加缺少的换行符,或者您需要手动插入PO。