掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 3039|回复: 15

[求助] 怎样处理超长文本的换行【用二进制加载克服emedior换行速度慢的问题】

[复制链接]
  • TA的每日心情
    开心
    2023-10-30 09:58
  • 签到天数: 350 天

    [LV.8]以坛为家I

    发表于 2017-1-30 10:10:41 | 显示全部楼层 |阅读模式
    本帖最后由 许一诺 于 2017-1-30 20:25 编辑 & |# T; `# i5 i% V& {
    ! O: y7 |# K6 [$ t- f4 O+ Z8 _
    怎样处理超长文本的换行【用二进制加载克服emedior换行速度慢的问题】
    % c# ?# @$ ^0 d' J6 F. m, a7 s( C6 `( l5 V$ J6 T
    我是针对这样的问题写的:
    & L3 c3 T  l* N4 Y见sky66在https://www.pdawiki.com/forum/fo ... =%B1%E0%BC%AD%C6%F7的发言- b* Z5 S, e$ E: B9 }
    “我个人最常使用 EmEditor (LIFETIME 价格约 $120)来处理 mdx 源文件, 主要是有方便的提取功能和批处理, 而且打开大文件速度很快, 最致命的缺点就是正则处理 \n 速度很慢.
    3 X! [  ?: J! i/ ?这时候就要使用免费的 Notepad++ 来代劳处理 \n 了. Notepad++ 处理大档案有时会有一些问题, 而且没有方便的提取功能和批处理, 个人不习惯用来处理 mdx 源文件.
    6 `" P: m. n! {UltraEdit, 当然可打开大文件, 正则替换也很快, 但就是打开文件速度有点慢. 还有 Unlimited upgrades 的价格约 $300, 是 EmEditor 的两三倍, 比 Office 还贵, 实在买不下手./ G' W& B0 E7 O+ Q& I5 W% U4 @
    还有其他的编辑器, 大多有约略测试一下, 不是不顺手就是难以处理大文件.”

    * U4 X! D6 I# p* e7 f; e
    % M$ g! B6 \% I用论坛发许多图不方便,我就把文档输出为图片了,请直接看下面的5张图:+ C+ D, V7 `, ]% |, u- s
    " M/ p4 S" B5 q3 h! x- U1 W

    : `5 H  _) r5 {0 {
    7 S" }; w; a0 P, {- T8 d; y; H; }
    5 b" J  i# _4 P1 i6 \4 C; K9 v4 E4 Y1 G8 F% T7 C! j" w- H! _
    . {4 D' F( A5 f6 F. ?
    / M) W$ A# g! i* F
    下面是文字说明:; S# E+ W7 D5 a! r
    emeditor是非常适合打开超大文件的编辑器,不过它处理换行非常不便。
    2 h+ T7 ^( s6 i5 {4 }$ e下面截图中的文档超过1500万行,使用普通方式将\r\n\r\n转换为\r\n(也就是把空两行变成空一行非常慢)/ M) G1 C8 X7 Q  j, Z

    9 {( |6 u% i4 t" X- z0 F9 T对于这种问题以前有人建议用notepad++处理,其实也还是很慢的(1500万行估计要等10分钟以上)
    4 V" a% Z, J9 V
    3 i0 U" `) K  r; ?( I下面我来说一个快的方法(只需要几秒)+ N  N5 d, f5 @2 s
    如果在下面这个800万行的文本中把<br>变成\r\n(即将html的换行记号变成文本中的换行)' W- F+ |, ^3 ?
    " a, X+ C9 C9 p3 E4 T
    我们把文档重新载入,用“二进制(十六进制视图)”
    ! z6 J$ F/ p3 N/ x5 q文档变成这样:3 y1 M6 c6 p- x

    8 d' S( J1 }% r2 z% O& c文本自然的换行完全被打乱。左边是二进制数据,右边是对应的文本(换行符号显示为..(也就是两个点))。
    8 I- |' e. ^6 G/ g; d
    , N& v( b6 |, ]; l" [此时我们通过点击右边的文本,了解到:
    - h5 b: r* Q, i1 q, B6 u! j4 s5 `<br>对应二进制为3C 62 72 3E
    6 g$ G5 A3 K, Y$ W ; X, p! ]5 D; S: \$ ?6 w% l
    \r\n在后边显示为“..”,点击得知,对应二进制0D 0A, |- h& L: v& e# N2 w
    此时我们开始替换:7 f3 h1 m1 x1 b- B3 z1 _

    ) S4 E7 N1 [. E+ A如上图,把“3C 62 72 3E”替换为“0D 0A”,可以看到替换速度极快,如下图:* s' T* I' f$ e& x% L' C+ K! T2 Z4 m

    3 e# {1 M4 u6 k' R. d7 s' r替换完之后,默认对再搜索一遍有多少个3C 62 72 3E,如下图。
    ) u) n9 i6 @, E; m! h , d# Z) r* g- _% B- T( r( ]
    之后文本变成这样(如下图),有些行的长度减少了:9 J" P  B: s# Q7 w; A% ~/ q

    ' [5 a" h5 B8 ~  f9 M2 c0 Y  E保存文本,需要几秒钟时间:
    & y8 r& `, B# H6 d& E$ T& e
    0 f; T* C. g: e  {" o再重新打开文本(用普通方式打开),可以发现全部<br>都变成了换行。( s! T2 u* X, {6 h% B

    + D+ T* E) D9 I  o" S2 w  v4 E5 Y【总之,我这个方法就是让exeditor避免了普通文本的换行,改为用二进制模式处理,该模式下换行符号体现为普通字符。】
    & W$ q3 j2 Y: H4 o3 f; r
    & U2 a, n9 x* R; b
    - A) K8 _! e: J" d

    ; d/ H9 X& B6 Q) n% g: L- Q$ B后来发现的问题" u0 t# J# r9 \1 S9 g. r6 M
    / j' \/ P5 L. x0 \/ C
    可能是因为我选取的文档比较特殊,<br>的二进制代码“3C 62 72 3E”都不跨行。; x% g5 b; y, P0 M0 t& ]
    所以替换中没有问题,实际上可能会出现这样的情况:& ]2 M% M! h; |3 M/ D  `6 }$ \
    文本:
    7 \8 ?  l/ K6 \' _: C; v* V% L5 e- p4 j+ O2 s
    二进制加载
    ! E& L# |9 l; {' @$ m) g, k: M
    ) x' w" O: h, P# P/ R& n9 S; n# H/ g" o
    注意第4个<br>在换行的位置,这样用替换就处理不到(二进制下不能换行)。& C5 H3 W) u- C' n  {
    8 ^6 Z. B/ R. c; k/ z
    因为“3C 62 72 3E”是四个单位,所以<br>被“中间割断”的情况有4种:4=4+0=3+1=2+2=1+3/ }9 S$ \. K7 H$ ~$ |* G1 T
    我的解决方法是:6 J7 F* z1 C8 o# f$ i" `5 V9 \
    1. 给“3C 62 72 3E”替换为“0D 0A”录制一个宏,比如叫做macro.jsee
    / X3 \- e$ E2 @& R- Q9 O! T  M+ t( M" t2. 运行一次宏,保存文本,在文本头加一个“3C”,也就是一个“<”字符。& L+ ~  O" D: N! b
    3. 保存,重新打开,加载为二进制,再运行一次宏。
    + e: A( i# Z: E$ ~, }) C  o1 S: Y4. 再重复步骤3两次。7 b" r. q  q9 H% o! s; q( z
    - F9 c* {0 h# n& Z0 ^
    下面我要指出emeditor的几个特点:
      h$ P2 i: X/ W3 N  X1. 按照“行”来处理替换等操作,所以只要不跨行执行速度就快(比如“抽取符合条件的行”),跨行就慢。
    & S1 u* f% F5 B) \" i2. 但是如果一行非常长,处理起来也会很慢,比如把一个几千万行的文本换行全部取消变成一个一行的文件再执行替换操作。
    + C, D& ?+ [) e5 G3. 综上,emeditor擅长处理每行不是非常长(不达到几十万个字符),但是行数特别多的文本。
    $ ^( ^) f, I/ u* ?. c% F4. emeditor有一个快速处理行的转换的功能,就是“保存文件”,每次保存并重新打开为二进制,都会重新排版。, q, d0 g3 J: }, J7 r1 U, i8 x

    本帖被以下淘专辑推荐:

  • TA的每日心情
    开心
    2024-11-25 15:48
  • 签到天数: 2137 天

    [LV.Master]伴坛终老

    发表于 2017-1-30 10:32:24 | 显示全部楼层
    了不起!赞一个!
  • TA的每日心情
    开心
    2022-3-11 16:40
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2017-1-30 15:13:40 | 显示全部楼层
    本帖最后由 mingqing007 于 2017-1-30 15:15 编辑 ! D  T5 z4 W$ \9 h2 @' H( u) ?' J

    & l5 w0 S2 V. z9 D3 D哈哈,好办法,感谢分享,回头试试看。8 y0 W2 ^4 M9 k. Y

    3 O0 ~+ C* _1 Q. E" E7 K! eEMEditor处理换行速度确实不佳,Notpad++处理大文件时长处理不完全。
    " n0 S7 t9 c- z
    0 M+ s0 S) n% u3 w
    4 ~7 o; V$ s& T+ P0 O2 g6 ~* S; _  c  u, m+ C1 G/ U
    传送门:https://www.pdawiki.com/forum/forum.php?mod=viewthread&tid=19749&page=1&extra=#pid449490

    该用户从未签到

    发表于 2017-1-30 18:34:12 | 显示全部楼层
    好经验,之前一直用UltraEdit处理大量换行替换
  • TA的每日心情
    开心
    2022-3-11 16:40
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2017-1-30 21:08:54 | 显示全部楼层
    本帖最后由 mingqing007 于 2017-1-30 21:10 编辑 - [& a$ \" m2 o; w1 ]
    2 G& ~' o4 J1 Z; @0 |" E: C6 O4 z
    看到另一种用命令行模式提速换行符处理的的方法。5 N0 Y+ s* q/ \

    . G4 r- W/ o7 f- S& P没有测试过,不知是否好用,也贴在这里吧,留个有心人有时间测试一下:1 _# c5 u1 Z# p3 b6 o* M

    ! y- S' I( F3 q, H: @https://www.emeditor.com/forums/ ... its-very-very-slow/
    ; q  w6 S5 M7 j4 L) D# y0 }, o: O) d# e4 a& c/ [& |* a; W
    6 |+ {5 q2 g* s4 M
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ( ?2 n" v2 o% k) L1 K& g& H8 h, u  T/ q* n8 g' q2 v
    The graphical interface seems to slow it down when it’s doing \n or \r or \r\n , etc.- b, O' z9 V+ i3 a% H

    6 S& G0 l7 m& Z6 F8 k( W4 e9 W# ^. wMake the change from command prompt. I have a 7mb doc that is just numeric CSV data – like this 234, 345, 111, etc. From the command prompt the change to the file is practically instant.
    # a$ V& g3 a& Y, q8 s
    5 Q8 f! l8 k4 I+ jHere I am replacing comma space with new line.2 _% ]0 j1 }/ a2 C% P
    ' r( _- I2 x/ Z3 ^$ i" r
    c:\emeditor /fi “, ” /x “c:\output2.txt” /rw “\r\n”  @. r' o' a, Y
    . [5 r/ v  H' g% v# e% P( m. n( |
    It is the same speed to go in the other direction.

    1 q, J+ A. Q! o/ h/ g) q! m! q
    ! V8 W) E% I/ _8 {; z----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • TA的每日心情
    开心
    2023-1-14 04:24
  • 签到天数: 128 天

    [LV.7]常住居民III

    发表于 2017-1-31 11:12:38 | 显示全部楼层
    chigre3 发表于 2017-1-30 18:341 o. B9 ?2 P& \
    好经验,之前一直用UltraEdit处理大量换行替换

    2 y% |3 z1 ~: [6 ]8 T同意这个;UE处理换行速度没的说。
  • TA的每日心情
    郁闷
    2018-5-17 09:15
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2017-2-9 14:13:04 | 显示全部楼层
    试了一下,对小文件是可以,但对大文件则进不了二进制模式.

    该用户从未签到

    发表于 2017-2-9 15:55:20 | 显示全部楼层
    各种方法我都用过,最终我的选择是把超大文件分割成多个小文件,再用文本编辑类软件通常都有的“在文件中查找替换”解决换行问题。这样既可以兼顾效率,又能避免文本编辑类软件在编辑超大文件时容易出错的问题。

    点评

    这方法好,速度上会快很多。不过只限一个软件总是有点不擅长的地方,结合其它软件一起用更快。  发表于 2017-2-9 17:18

    该用户从未签到

    发表于 2017-2-9 19:21:01 | 显示全部楼层
    mingqing007 发表于 2017-1-30 21:08
    8 |0 [' k1 P+ r1 }% X# C& \看到另一种用命令行模式提速换行符处理的的方法。# S% O. x* q/ O, {/ D, _, m, [( E+ E

    . ^! s9 d2 s+ r8 g没有测试过,不知是否好用,也贴在这里吧,留个有心人 ...
    5 r1 L4 L# U4 J, _+ }
    之前我有测试过命令行模式, 很可惜..还是很慢.

    该用户从未签到

    发表于 2017-2-9 19:49:31 | 显示全部楼层
    二进制方式我也试过, 的确是有效, 适用于较简单的替换
    ) w- B3 p- Z" T+ X. H5 e8 R1 t! u
    5 Q6 t. U& J; F5 j, a: _) C! K但处理mdx麻烦的地方在于有些分段比较复杂, 是需要用到正则删除多余的内文与\n
    3 n  D! p# p$ p5 I像是网页下来的文本 : <head>\n...<title>...</title>\n...</head>\n...</body>\n</html>\n
    0 F. Y# o% W) U
    $ l! D8 ~- C& S9 I0 K如果直接用Emeditor 将 <head>\n 替换为 "空", 须花较长的时间
    8 P3 P* h2 [- [7 R; o( ?如果先将 <head> 替换 为 "空",  再将 \n 设为"书签" => "删除书签" 的方式, 就会很快..
    % r) {2 }& l) |
  • TA的每日心情
    开心
    2022-3-11 16:40
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2017-2-9 19:49:41 | 显示全部楼层
    sky66 发表于 2017-2-9 19:21) N0 a) }! ?7 C/ ]+ s
    之前我有测试过命令行模式, 很可惜..还是很慢.

    - A3 }& F# M$ m: kSublimeText 貌似不存在这个问题. 可以试试看.
  • TA的每日心情
    慵懒
    2025-1-28 16:22
  • 签到天数: 216 天

    [LV.7]常住居民III

    发表于 2017-2-10 13:25:23 | 显示全部楼层
    在我的机器上,Sublime Text 打开170MB-200MB的txt还是会卡。今天我准备试试看VSCode。

    该用户从未签到

    发表于 2017-2-10 13:33:45 | 显示全部楼层
    直接 sed 就可以了,用 perl 也行。

    该用户从未签到

    发表于 2017-3-31 17:50:01 | 显示全部楼层
    今天使用 EmEditor v16.6.0 beta 1 实际测试三百万行的colmdx txt,
    # b1 p0 X' t0 ?# O</div>\n 替换为</div>5 o( z9 H# v  I0 L2 e" p1 Q4 o
    已经有大幅度的改善了.
    ' s0 _# k( Y1 X+ c2 x5 y) ^* c' V
    2 U! C. f/ r  N- C: e# v6 a正则引擎选 Onigmo 又比 Boost.Regex(默认) 更快
    " T4 N5 }* o6 _1 [5 D1 S2 S, [
  • TA的每日心情
    奋斗
    2018-11-10 00:38
  • 签到天数: 346 天

    [LV.8]以坛为家I

    发表于 2017-4-30 00:06:10 | 显示全部楼层
    算是个思路吧,有点胡搞乱搞的瞎折腾的感觉,不知道各位在折腾繁简转换的时候用没用过lopencc,处理几百兆的文件基本秒杀。其中opencc有一个自定义字典的功能,如果各位把想要替换的字符定义到opencc的自定义字典里,看看啥效果?
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2025-4-27 00:11 , Processed in 0.023524 second(s), 24 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表