2011-09-29 82 views
68

Cho phép nói rằng tôi muốn có 10 hàng dữ liệu nhưng tôi muốn có giá trị gia tăng cho mỗi hàng hoặc một phần dữ liệu. Làm cách nào để tăng giá trị đó?Notepad ++ tăng dần thay thế

Ví dụ .... Nếu tôi có các hàng này, có cách nào thay thế giá trị id để tăng không?

<row id="1" /> 
<row id="1" /> 
<row id="1" /> 
<row id="1" /> 
<row id="1" /> 

--- Dưới đây là những gì tôi muốn nó trông giống như ... (nếu id hàng đầu tiên của đi lên một thats ok)

<row id="1" /> 
<row id="2" /> 
<row id="3" /> 
<row id="4" /> 
<row id="5" /> 
+0

Thay thế Notepad ++ không làm toán, cũng không thực hiện regex. – Amber

+0

Nếu có thể, nó vô cùng khó khăn. Không có khái niệm về các con số trong các biểu thức chính quy (do đó không có +1) và không có cách dễ dàng để tích lũy dữ liệu khi bạn so khớp với một regex (vì vậy không có kết quả "tiếp theo"). XSLT có thể giúp bạn ở đây, nếu bạn thực sự cần phải tự động hóa điều này. –

+0

@Amber Notepad ++ có chức năng hạn chế regex. – Karolis

Trả lời

135

Không chắc về regex, nhưng có một cách để bạn làm điều này trong Notepad ++, mặc dù nó không phải là rất linh hoạt.

Trong ví dụ bạn đã cung cấp, giữ Alt và chọn cột số mà bạn muốn thay đổi. Sau đó, truy cập Edit->Column Editor và chọn nút radio Number to Insert trong cửa sổ xuất hiện. Sau đó, xác định số lượng ban đầu của bạn và tăng, và nhấn OK. Nó sẽ ghi ra các số tăng dần.

Lưu ý: tính năng này cũng hoạt động với tính năng Multi-editing (chọn một số vị trí trong khi duy trì Ctrl phím được nhấn).

Tuy nhiên, không phải bất kỳ nơi nào gần tính linh hoạt mà hầu hết mọi người đều thấy hữu ích. Notepad ++ là tuyệt vời, nhưng nếu bạn muốn một trình soạn thảo thực sự mạnh mẽ có thể làm những việc như thế này một cách dễ dàng, tôi muốn nói sử dụng Vim.

+4

+1 cả hai đối với tính năng cột tối nghĩa, và lưu ý rằng vim là một trình soạn thảo mạnh mẽ hơn. ;) –

+0

Notepad ++ là tuyệt vời, nó sẽ là tuyệt vời nếu chúng ta có một trình soạn thảo văn bản trực tuyến mạnh mẽ như thế này. –

+1

Với tôi là: chọn cột có Alt + Shift và sau đó làm Số để chèn. Hoạt động hoàn hảo – Rombus

5

Vì có những câu trả lời thực sự có giới hạn, tôi sẽ chia sẻ cách giải quyết này. Đối với thực sự trường hợp đơn giản như ví dụ của bạn, bạn làm điều đó ngược ...

Từ này

1 
2 
3 
4 
5 

Thay \r\n với " />\r\n<row id=" và bạn sẽ nhận được 90% số đường có

1" /> 
<row id="2" /> 
<row id="3" /> 
<row id="4" /> 
<row id="5 

Hoặc là một thời trang tương tự, bạn có thể hack về dữ liệu với excel/bảng tính. Chỉ cần chia dữ liệu gốc của bạn thành các cột và thao tác các giá trị theo yêu cầu của bạn.

| <row id=" | 1 | " /> | 
| <row id=" | 1 | " /> | 
| <row id=" | 1 | " /> | 
| <row id=" | 1 | " /> | 
| <row id=" | 1 | " /> | 

Công cụ rõ ràng nhưng có thể giúp ai đó thực hiện công việc hack một lần lẻ để lưu một vài nét chính.

+3

thay thế '(. *)' Bằng '' trong chế độ regex mà không có '. phù hợp với newline' sẽ giúp bạn có được 100% con đường ở đó. – satibel

12

Tôi đã tìm kiếm cùng một tính năng ngay hôm nay nhưng không thể thực hiện việc này trong Notepad ++. Tuy nhiên, chúng tôi có TextPad để giải cứu. Nó làm việc cho tôi.

Trong hộp thoại thay thế của TextPad, hãy bật regex; sau đó bạn có thể thử thay thế

<row id="1"/> 

bởi

<row id="\i"/> 

Hãy nhìn vào liên kết này để biết thêm tuyệt vời thay thế tính năng của TextPad - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/

+1

Tôi đoán nó sẽ giúp ích nếu tôi thực sự chú ý. Đã kết thúc cài đặt SublimeText. :) Cảm ơn. –

+0

Làm việc hoàn hảo cho tôi cảm ơn bạn! –

+0

Nhưng đảm bảo bạn nhấn nút "Thay thế tất cả". "Thay thế tiếp theo" sẽ không tăng bộ đếm. Phải mất nhiều giờ để tìm ra điều này. \ i Thay thế bằng các số bắt đầu từ 1, tăng thêm 1. \ i (10) Thay thế bằng các số bắt đầu từ 10, tăng thêm 1. \ i (0,10) Thay thế bằng các số bắt đầu từ 0, tăng thêm 10 \ i (100, -10) Thay thế bằng các số bắt đầu từ 100, giảm dần xuống -10. –

2

(Đăng trong trường hợp ai đó có thể sử dụng nó).

tôi đang tìm kiếm một giải pháp cho một vấn đề phức tạp hơn một chút so với OP - thay thế MỌI xảy ra một cái gì đó với số lượng bằng cách điều tương tự với tăng lên số

Ví dụ: Thay thế một cái gì đó như thế này:

<row id="1" /> 
<row id="2" /> 
<row id="1" /> 
<row id="3" /> 
<row id="1" /> 

Bằng cách này:

<row id="2" /> 
<row id="3" /> 
<row id="2" /> 
<row id="4" /> 
<row id="2" /> 

Couldnt tìm ra giải pháp trực tuyến vì vậy tôi đã viết kịch bản của riêng tôi trong groovy (một chút xấu xí nhưng không được công việc):

/** 
* <p> Finds words that matches template and increases them by 1. 
* '_' in word template represents number. 
* 
* <p> E.g. if template equals 'Row="_"', then: 
* ALL Row=0 will be replaced by Row="1" 
* All Row=1 will be replaced by Row="2" 
* <p> Warning - your find template might not work properly if _ is the last character of it 
* etc. 
* <p> Requirments: 
* - Original text does not contain tepmlate string 
* - Only numbers in non-disrupted sequence are incremented and replaced 
* (i.e. from example below, if Row=4 exists in original text, but Row=3 not, than Row=4 will NOT be 
* replaced by Row=5) 
*/ 
def replace_inc(String text, int startingIndex, String findTemplate) { 
    assert findTemplate.contains('_') : 'search template needs to contain "_" placeholder' 
    assert !(findTemplate.replaceFirst('_','').contains('_')) : 'only one "_" placeholder is allowed' 
    assert !text.contains('_____') : 'input text should not contain "______" (5 underscores)' 
    while (true) { 
     findString = findTemplate.replace("_",(startingIndex).toString()) 
     if (!text.contains(findString)) break; 
     replaceString = findTemplate.replace("_", "_____"+(++startingIndex).toString()) 
     text = text.replaceAll(findString, replaceString) 
    } 
    return text.replaceAll("_____","") // get rid of '_____' character 
} 

// input 
findTemplate = 'Row="_"' 
path = /C:\TEMP\working_copy.txt/ 
startingIndex = 0 

// do stuff 
f = new File(path) 
outText = replace_inc(f.text,startingIndex,findTemplate) 
println "Results \n: " + outText 
f.withWriter { out -> out.println outText } 
println "Results written to $f" 
3

tôi có cùng sự cố với hơn 250 dòng và đây là cách tôi đã thực hiện:

ví dụ:

<row id="1" /> 
<row id="1" /> 
<row id="1" /> 
<row id="1" /> 
<row id="1" /> 

bạn đặt con trỏ ngay sau "1" và bạn click vào alt + shift và bắt đầu giảm dần với mũi tên xuống cho đến khi tầm với của bạn điểm mấu chốt bây giờ bạn nhìn thấy một nhóm các lựa chọn bấm vào xóa để xóa số 1 trên mỗi dòng cùng một lúc và đi đến Edit -> Column Editor và chọn Number to Insert sau đó đặt 1 trong lĩnh vực số ban đầu và 1 trong tăng lên bởi hiện trường và kiểm tra zero số rồi ấn vào ok

Xin chúc mừng bạn đã làm điều đó :)

3

http://docs.notepad-plus-plus.org/index.php/Inserting_Variable_Text

Notepad ++ được trang bị Trình chỉnh sửa -> Cột "Alt + C" Editor có thể hoạt động trên lựa chọn hình chữ nhật theo hai cách khác nhau: Coledit.png chèn một số văn bản cố định trên mỗi dòng bao gồm và theo dòng hiện tại, tại cột của điểm chèn (aka caret). Văn bản được chọn ban đầu không được chạm vào. Như hình minh họa, một chuỗi số tuyến tính có thể được chèn theo cách tương tự. Giá trị bắt đầu và số gia tăng sẽ được cung cấp. Còn lại padding với zeroes là một lựa chọn, và số có thể được nhập vào cơ sở 2, 8, 10 hoặc 16 - đây là cách các giá trị tính toán sẽ được hiển thị quá, padding được dựa trên lớn nhất.

+0

Sẽ tốt hơn nếu bạn đính kèm hình ảnh trong bài đăng để tránh nhầm lẫn khi đọc câu trả lời của bạn –

1

Bạn có thể làm điều đó bằng Powershell qua regex và foreach vòng lặp, nếu bạn lưu trữ giá trị của bạn trong tập tin INPUT.TXT:

$initialNum=1; $increment=1; $tmp = Get-Content input.txt | foreach { $n = [regex]::match($_,'id="(\d+)"').groups[1 
].value; if ($n) {$_ -replace "$n", ([int32]$initialNum+$increment); $increment=$increment+1;} else {$_}; } 

Sau đó bạn có thể lưu trữ $ tmp trong tập tin sử dụng $tmp > result.txt. Điều này không cần dữ liệu trong cột.

Các vấn đề liên quan