2016-03-08 34 views
3

如果我試圖在文本文件中創建一列,並使用在文本文件的特定區域中找到的相同值填充該列,我可以使用正則表達式查找/替換以成功完成此操作。由於列最右邊,我找到\r並替換爲,VALUE,\r其中VALUE從前一個副本(CTRL - C)粘貼命令。問題是,因爲它記錄的CTRL的價值,我不能做這項工作作爲其他文件宏 - V代替按鍵命令CTRL - V。有沒有辦法讓宏模仿CTRL - V而不是填寫一個特定的值?Notepad ++中的宏是否可以包含擊鍵?

添加信息: 文件中的每一行都需要粘貼的值。原因是因爲每一行都包含產品編號和數量。通過能夠粘貼在其中一個標題中找到的值,我可以將這些行鏈接到由粘貼值表示的順序。因此,一個表格將包含訂單號,日期等,其中另一個表將包含訂單的細節,即項目。

這是一個示例的文件:

ITEMNAME,ITEMID,QTY STORE#578 PO 0076875422 2014年4月1日,運輸
BLUE FISH,98799,3
RED FISH,48573,10
YELLOW SNAIL,94582,2
綠蜥蜴介質,32451,12
BLACK TARANTULA,29879,909

在記事本+ +這個文件運行該腳本將看起來像這樣經過:
ITEMNAME,ITEMID,數量STORE#578 PO 0076875422 2014年4月1日,發貨,ORDER_NUMBER 藍色的魚,98799,3,0076875422
紅色的魚,48573,10,0076875422
黃泥螺,94582,2 ,, 0076875422
綠蜥蜴-MEDIUM,32451,12,0076875422
BLACK TARANTULA,29879,909,0076875422

含有QTY標題包含的其他數據:存儲的數目,順序號,並順序更新。訂單號總是以「PO」開頭,並且總是10位數字。宏需要能夠在每個文件中找到它,然後將其添加到每行的末尾,但需要在逗號前加上一個逗號以允許SHIPPED列中的空值。當然,您還會注意到標題已添加到名爲ORDER_NUMBER的標題行中。

我在那裏遇到困難的是,能夠將訂單號的值粘貼到我當前宏中每行b/c的末尾,它只能粘貼當時粘貼的值記錄,而不是正在處理的當前文件中的實際採購訂單編號。所以我想通過告訴宏在標題行中找到採購訂單編號並將其複製到剪貼板後,我能記錄下CTRL-V按鍵,然後它就可以工作。

+0

副本並在宏中粘貼快捷方式工作_查找/替換對話框的罰款。但是,它們不會在對話框中顯示出來 - 這可能是由於與其他命令相比記錄對話框的方式,但很難肯定地說。我在[Notepad ++ Wiki](http://docs.notepad-plus-plus.org/index.php/Macros)中找到了這一行,這是我的想法:_「Notepad ++處理查找和替換操作記錄本身,因爲它們會帶來同樣的困難。「_我正在尋找一種方法來做到這一點,但它可能是不可能的。 – Kendra

+0

嗨肯德拉。如果你發現任何東西,聽到迴音會很高興。我被告知python腳本可以完成我想要完成的任務,但是Notepadd ++無法按照我的希望存儲擊鍵。 – Chano

+0

我還沒有找到辦法自己做。我曾希望可能有一個插件可以幫助,但我沒有嘗試過。我認爲你最好的選擇將是與腳本一起去。也許未來的更新會做到這一點,但目前看起來這並不安靜。 (我也看過手動編輯一個已保存的宏,但我認爲我的系統有些問題導致它無法正確保存,如果我能夠設法做到這一點並使其運行起來,我會發布如何解決去做吧。) – Kendra

回答

1

這是承諾的NppExec腳本。它保存到一個腳本名稱,那麼你可以用一個菜單項目名稱添加到NppExec菜單(在插件 - > NppExec - >高級選項腳本名稱項目名稱關聯)重新啓動記事本++後,您會發現這個項目名稱位於快捷方式映射器的某個位置(位於插件選項卡下),您可以爲其分配鍵盤快捷方式。

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命令來遠程控制編輯器。消息的文檔位於第一行的鏈接中。但也有大量的試驗和錯誤。

+0

@Chano解決方案不是非常快速:例如只有每秒幾行。我擔心這個問題不適合記事本++。你有sed或awk可用嗎? –

+0

非常感謝拉斯和克里斯。我會盡快探索這個! – Chano

+0

拉爾斯,這真的有用!我在這裏添加了一個逗號:SCI_SENDMSG SCI_INSERTTEXT -1 @「,, $(POText)」,這樣它就可以爲SHIPPED數據創建一個空白列。因爲我最長的文件大約200行,我認爲速度是可以忍受的。 2個問題:如果文件以空行結束,是否有一種簡單的方法可以避免在文件末尾創建行?另外,是否可以擴展相同的命令,以便在數量標題中找到的其他字符串上執行相同的操作,如存儲號?我沒有sed或awk。用戶將在Windows機器上。 – Chano

0

由於NPPExec劇本是這麼慢,這裏是另一個純記事本+解決方案:

做一個正則表達式查找/替換這樣的:

  • 打開替換對話框
  • 查找內容:(PO (\d{10})[^\r\n]+\R(.*\2\R)*+)([^\r\n]+)(\R)
  • 替換爲:\1\4,\2\5
  • 檢查正則表達式
  • 單擊替換或全部替換
  • 繼續單擊全部替換(或按住Alt-A按),直到沒有更多的替代品是由(查找對話框的狀態欄會告訴你)
  • 手動附加,ORDER_NUMBER第一線

一個先決條件是,最後一行在其末端斷行,這意味着你必須在最後一行手動添加缺失的斷行,或者您需要手動插入的採購訂單。

+0

嗨拉爾斯,非常感謝這個正則表達式的建議。它只能在第一行找到並替換,但我會採用一些正則表達式,並能夠將它應用到別處! – Chano

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 NextAlt+F4
RightEditBegin/End Select
Find查找內容:
Find NextAlt+F4
LeftEditBegin/End SelectCtrl+CEndRight
Stop recording
Save current recorded macro名稱:Save PO #OK

2)Start recording End,Ctrl+VRight
Stop recording
Save current recorded macro名稱:​​OK

3)打開文件進行編輯
MacroSave PO #
Run a Macro Multiple Times
宏運行:​​Run until end of fileRun

+0

克里斯,它的工作原理!首先存儲複製的字符串並關閉該宏,然後再運行另一個宏。如果在文件末尾多次運行一個宏可以通過鍵盤快捷方式來記錄宏選擇,並且也可以關閉自己,但也許會遲一些。 – Chano

相關問題