如何在Notepad ++中按每行的长度对文本文件中的行进行排序?


13

如何在Notepad ++中按行长对文本文件进行排序?是否有可用于上述任务的插件?
如果没有插件,为了编写插件Myself,应该阅读的第一本和第二本教程是什么?


1
您知道,有时最好只编写一些代码并付诸实践。
Daniel R Hicks 2013年

您正在处理小型文件还是大型文件?
ComFreek 2013年

50 MB的文件,带有长行,大约250 KB的长度。
hpaknia

数据敏感吗?还是可以在Dropbox / Google-Drive / etc。上共享它?如果Notepad ++可以打开并处理该文件,我可以想象我的解决方案可以工作,但是我很想自己尝试一下。
Dane 2013年

嘿@HPM,是否有机会处理您的数据?
Dane 2013年

Answers:


6

这个答案的灵感来自YouTube视频。更新以保持原始排序顺序(如果重要)。

Notepad ++具有内置的TextFX工具,可按字母顺序对选定的行进行排序。通过在每行的左侧放置空格,并确保所有行的长度相同,可以劫持该工具以按行的长度排序。

“动物园”按字母顺序位于“他们的房子”之前,因为该空间被视为字符,并且位于“ i”之前。__X(假设下划线实际上是空格)将类似地按字母顺序出现在之前_XX。这个答案的想法是添加空格和行号,以便__________092dog在上面进行排序_003alligator

我将使用以下数据作为示例数据:

Lorem
ipsum
dolor
sit
amet
consectetur
adipisicing

步骤1.添加行号。

(barlop添加的注释-有关此步骤的读者注意事项,我们不会根据这些行号进行排序,而是根据行的长度进行排序。但是添加行号的原因是知道自然顺序,因此,例如,当两条以上的线等长时,我们可以根据该自然顺序对这些线进行排序)

假设文本文件中仅包含数据,请将文本光标(垂直线)放在文件的第一位置。然后在Edit菜单中选择Column Editor...Alt+ C)。选择“要插入的数字”并从1开始,加1,并包括前导零。请注意,从最短字符串到最长字符串排序时,这将保留原始顺序。如果要按最长到最短的顺序排序,请先反转所有行

1Lorem
2ipsum
3dolor
4sit
5amet
6consectetur
7adipisicing

步骤2.用前导空格填充所有行。

将文本光标(垂直线)放置在文件的第一位置。然后在Edit菜单中选择Column Editor...Alt+ C)。插入足够的空格,以便将最短的数据行填充为最长的数据行的长度。如果最短的行有4个字符,最长的有44个字符,请确保至少插入40个空格。

__________1Lorem
__________2ipsum
__________3dolor
__________4sit
__________5amet
__________6consectetur
__________7adipisicing

步骤3.将线修剪成均匀的长度。

使用以下正则表达式查找/替换(Ctrl+ H)来匹配等于或超过最长数据行长度的右侧字符。

^.*(.{50})$

全部替换为$1。除了每行最右边的50个字符外,这将修剪所有内容。如果您的数据比50长(或短),请调整{50}正则表达式中的。

(请注意barlop补充-这里的想法是最短的行开头具有最多的空格

_______1Lorem
_______2ipsum
_______3dolor
_________4sit
________5amet
_6consectetur
_7adipisicing

步骤4.对行进行排序。

选择所有文本(Ctrl+ A)。通过TextFX菜单,转到Text FX > TextFX Tools > Sort lines case sensitive (at column)。现在,您的数据应按从最短到最长的长度顺序排列。如果要按从长到短的顺序排列它们,请Text FX > TextFX Tools > + Sort ascending在分类之前取消选中该选项。注意如何将行号反转。

_________4sit
________5amet
_______1Lorem
_______2ipsum
_______3dolor
_6consectetur
_7adipisicing

步骤5.删除前导空格。

使用另一个正则表达式查找/替换(Ctrl+ H)来匹配前导空格。

^ *\d{4}

那是插入符号和星号之间的空间。一无所有。如果您使用4位数字的行号,则将删除所有前导空格和插入的行号。用{4}行号中的正确数字替换。

sit
amet
Lorem
ipsum
dolor
consectetur
adipisicing

我使用Notepad ++的宏功能记录了上述步骤,但是它不起作用。我不确定哪个步骤失败了,但是我还没有诊断出为什么。如果重复执行此操作,则可能会使用AutoHotKey来自动执行此操作。


2
警告:这不是一个稳定的排序。换句话说,相同长度的行在排序后不一定会以相同的顺序出现-相反,它们将按字典顺序进行排序。
Bob

@Bob是正确的,如果您具有给定长度的行(例如33个字符),并且这些行具有特定的顺序,则这些行将不会反映在结果中。我们可以在第1步之前用Alt + C添加行号(包括前导0以确保长度保持相等)。然后,在步骤4中清理时,请使用^ *\d{5}或使用任何数字位数作为行号。
Dane 2013年

2
假设很重要,答案已更新为保留现有的排序顺序。
Dane 2013年

很不错的人,可以追踪youtube视频中那个人在做什么,他在那里也禁止评论。您可以在pastebin pastebin.com上添加您认为失败的文本链接 吗?并且仅通过宏还是手动失败了?
barlop

1
我必须说,阅读您的答案,只有在尝试时才理解。我认为您没有获得更多选票的原因可能是人们不了解其逻辑。您是否允许我在一开始就在回答中添加逻辑解释?
barlop

3

不,我不认为有。最接近的是TextFx插件,但这是基于字符的排序,而不是基于行长的排序。最好的选择是将文本放入电子表格中并在其中排序(使用该LEN()函数使用单独的计算列)。


谢谢,文本文件行长且总大小很大,因此我放弃了电子表格编辑器。让我更新问题。
hpaknia

@HPM很好,如果您愿意在notepad ++之外查看,则可以通过命令行来完成。就像使用一些命令来获取每一行末尾的行长。那么您至少会更接近这样做。
barlop 2013年

谢谢,这是一个很好的建议。我很好奇的是NP ++有很多插件,为什么这个插件不存在?
hpaknia

1

您可以在CSV文件的N ++中使用SQL!例如,如果您有:

col1;
hgfhfghfhg;
khjfhgfhfghfgh;
kjhfhgfhfhgfghfhf;
lkjgjghjhg;
lkjgjg;

,您可以执行命令select * from data order by length(col1) desc以降序排列。“数据”是指当前文件。“ col1”-第一(和最后)列的名称。

不幸的是,可能存在一个错误,该错误不允许在单列文本的行后放弃定界符。


如果只有N ++中的SQL不会破坏数据输出,这实际上是一个很好的解决方案。我刚刚测试了您的解决方案,并使用快速的正则表达式替换将定界符添加到所有行的末尾,但是数据输出将所有内容都转换为小写,并用问号替换了破折号。
Dane 2013年

@Dane(我目前无法使用Notepad ++。)也许尝试在每行的开头和结尾添加单引号(然后在其后添加分号)?也许双引号?
鲍勃

@鲍勃:不好。在N ++插件中的SQL发行说明中甚至提到了小写字母。
Dane 2013年

0

或者,如果您碰巧拥有linux和nedit:

ctrl-a
alt-r
perl -e 'print sort { length($a) <=> length($b) } <>'

这不仅不是问题所要问的,甚至不适用于同一OS平台。
卡列布

仍然是一个有用的答案。这是唯一对我有效的方法。他确实指定您需要linux和nedit,所以没有问题。
安东尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.