TA的每日心情 | 开心 2023-10-30 09:58 |
---|
签到天数: 350 天 [LV.8]以坛为家I
|
本帖最后由 许一诺 于 2017-1-30 20:25 编辑 2 j4 ?1 f" U6 s) |9 j/ }9 W
0 F1 |0 G$ I9 k
怎样处理超长文本的换行【用二进制加载克服emedior换行速度慢的问题】
$ G9 k) C a& [) M6 q# A' U m8 h8 I0 A5 b1 \
我是针对这样的问题写的:5 O9 H6 @# ~4 s5 N9 V
见sky66在https://www.pdawiki.com/forum/fo ... =%B1%E0%BC%AD%C6%F7的发言
" |' f8 t7 a* J% E“我个人最常使用 EmEditor (LIFETIME 价格约 $120)来处理 mdx 源文件, 主要是有方便的提取功能和批处理, 而且打开大文件速度很快, 最致命的缺点就是正则处理 \n 速度很慢.
8 F1 R/ g8 H9 p# `. d l这时候就要使用免费的 Notepad++ 来代劳处理 \n 了. Notepad++ 处理大档案有时会有一些问题, 而且没有方便的提取功能和批处理, 个人不习惯用来处理 mdx 源文件.5 ?, c& h6 Q j D$ _/ U# t! K0 U, y
UltraEdit, 当然可打开大文件, 正则替换也很快, 但就是打开文件速度有点慢. 还有 Unlimited upgrades 的价格约 $300, 是 EmEditor 的两三倍, 比 Office 还贵, 实在买不下手.' E( P# I8 \ ?- _; B: r- S
还有其他的编辑器, 大多有约略测试一下, 不是不顺手就是难以处理大文件.” , C' g) r, ?* Q# T, l
0 v7 V+ [& Z! g. \- w2 q# g9 D8 W用论坛发许多图不方便,我就把文档输出为图片了,请直接看下面的5张图:
0 B# Y( W" z9 f+ h& }; R( C- {' |+ y) i" |- k a
; ]& Z2 t' e' t5 K1 J6 e% ~
7 I: o' f' t3 g5 Y$ T3 T

* R- ^( m' @# I( R- E Q I! r4 s
8 m! i9 g* O1 ?3 e( g, I7 H) C$ q
2 m7 a: A; S5 T/ Z% N3 n: ~4 f, u" G6 l9 b& t
下面是文字说明:
1 ?3 l- o; D6 K. m% uemeditor是非常适合打开超大文件的编辑器,不过它处理换行非常不便。+ F6 q* s0 r/ j& T1 E1 g7 y
下面截图中的文档超过1500万行,使用普通方式将\r\n\r\n转换为\r\n(也就是把空两行变成空一行非常慢)
R. Y) d1 |3 R6 M) z# \0 b* s; A 1 {* v) B- E3 d5 x6 z
对于这种问题以前有人建议用notepad++处理,其实也还是很慢的(1500万行估计要等10分钟以上)
`8 r. S- P& j! i* [4 A5 m! w6 z5 a* p
下面我来说一个快的方法(只需要几秒)
7 \8 I; {4 q4 w; O) T. R如果在下面这个800万行的文本中把<br>变成\r\n(即将html的换行记号变成文本中的换行)
7 r4 G7 X5 K+ t1 A" h& z
8 ?. [' w4 L$ a3 m5 S1 X我们把文档重新载入,用“二进制(十六进制视图)”
S( s4 k+ r9 Q文档变成这样:; h# ~) E: z4 b A9 _9 C1 w% U
2 W" G" Y7 Q4 d- U2 A文本自然的换行完全被打乱。左边是二进制数据,右边是对应的文本(换行符号显示为..(也就是两个点))。
9 p1 L0 J0 {1 y7 w , M0 }6 X" N) a
此时我们通过点击右边的文本,了解到:
$ t3 m( e* Q8 d<br>对应二进制为3C 62 72 3E
( O" Q# J( {, X/ K1 ? , y8 c" |$ z! i2 G* o
\r\n在后边显示为“..”,点击得知,对应二进制0D 0A4 w& a6 ?! `0 F" v1 }; H6 p
此时我们开始替换:
: s* q# |5 u, U- s" ~3 o! X6 M % t! p* ^+ {' ]( y5 C
如上图,把“3C 62 72 3E”替换为“0D 0A”,可以看到替换速度极快,如下图:- S# x% S! G0 ?- ~3 J1 P
! e* C# U! G" J6 z# f' g0 S
替换完之后,默认对再搜索一遍有多少个3C 62 72 3E,如下图。
1 j5 L. U$ c( [: D, L4 p" |! A ( k5 R' p0 p2 s+ H0 D; }3 E5 m- u
之后文本变成这样(如下图),有些行的长度减少了:% {7 _3 x1 W6 }* U% W
2 u6 H& u2 Z* O }" j保存文本,需要几秒钟时间:
; Z# V, K7 p4 u6 X9 z $ e, |3 L, d% Z5 p; q
再重新打开文本(用普通方式打开),可以发现全部<br>都变成了换行。
7 K( @6 N/ Z0 m: L( ~& O % w% w, |% _+ U/ j0 _$ y3 O
【总之,我这个方法就是让exeditor避免了普通文本的换行,改为用二进制模式处理,该模式下换行符号体现为普通字符。】
& {; T" ^8 F! U+ G& u+ v! f
8 \! O2 U5 E* i, M& Z& L1 P
- t! m3 ~3 k; c; A* x5 G9 Z' J/ D5 j7 h+ B, t! d% Q! {
后来发现的问题
: T& R( E: g" r4 p! Y, W- F. W& t/ N& n/ W, `& i n+ s6 M
可能是因为我选取的文档比较特殊,<br>的二进制代码“3C 62 72 3E”都不跨行。# ~& T0 w6 \- N" }" R
所以替换中没有问题,实际上可能会出现这样的情况:2 t2 K: v: W3 t8 w5 ?
文本:$ a8 b: j9 a& [- X. n3 h" y
6 ?; \% N* ?) z
二进制加载. F. K% _! Q( i5 v8 H- s
" F& {; l7 l% E, {0 L
. U0 A$ D5 R1 U7 U. ~! H8 `注意第4个<br>在换行的位置,这样用替换就处理不到(二进制下不能换行)。* n% L5 i0 \; u3 ~3 P' N3 K3 w
B9 l8 J( h! H9 }/ L" ^1 ^
因为“3C 62 72 3E”是四个单位,所以<br>被“中间割断”的情况有4种:4=4+0=3+1=2+2=1+3: F6 J- d2 l3 ]# a3 a
我的解决方法是:
) m8 }6 ^5 ^5 c; h+ L, ]1. 给“3C 62 72 3E”替换为“0D 0A”录制一个宏,比如叫做macro.jsee
' L; M- k9 l3 r% l/ E% G2. 运行一次宏,保存文本,在文本头加一个“3C”,也就是一个“<”字符。$ [5 X1 c5 t I' m+ P9 {4 s
3. 保存,重新打开,加载为二进制,再运行一次宏。, e& G% j4 W/ [% ~+ ?
4. 再重复步骤3两次。8 \2 T# K. v6 e) u K7 D
( V# H' { _8 r+ @7 \
下面我要指出emeditor的几个特点:7 T) z5 @. l( s: N* p# d
1. 按照“行”来处理替换等操作,所以只要不跨行执行速度就快(比如“抽取符合条件的行”),跨行就慢。# ]+ [4 k+ j3 ^! e1 v! u- N
2. 但是如果一行非常长,处理起来也会很慢,比如把一个几千万行的文本换行全部取消变成一个一行的文件再执行替换操作。
5 h* f0 K, }7 e, ~; W- M( c* i3. 综上,emeditor擅长处理每行不是非常长(不达到几十万个字符),但是行数特别多的文本。
( ]; D3 p/ j* u4. emeditor有一个快速处理行的转换的功能,就是“保存文件”,每次保存并重新打开为二进制,都会重新排版。
/ f2 C; H. T$ I" O% S1 g7 { |
本帖被以下淘专辑推荐:
- · 图片词典制作|主题: 41, 订阅: 7
- · 工具|主题: 8, 订阅: 5
|