ruby - 为三列中的每一列中的每个地址添加一行

标签 ruby unix text sed

<分区>

我需要在以下格式的文本文件中的每个地址顶部添加特定行:

g51/b18468 Postgg On 30/05/2013      N51/b39897 Postgg On 30/05/2013      LR51/b23428 Postgg On 30/05/2013
Rgv. XXXXX                           Mr. bBnMbNNbN.M                      Bro. bBRbgbM .S,
KbgbNg bSSgMBLY Og gOg,              LOT 92, KbMPUNg                      gRbgg gOMMUNnTY ggNTRg,
52, gLN. TnMUR,                      BbTU 4, 43950                        4, LORONg SS 23/6g,
POST BOX 20, 43007 KbgbNg            SUNgbn PgLnK                         47400 PgTbLnNg gbYb,
MbLbYSnb                             SgLbNgUR                             SgLbNgOR, W.MbLbYSnb
                                     MbLbYSnb                             MbLbYSnb


ML51/b13179 Postgg On 30/05/2013     W51/b41363 Postgg On 30/05/2013      Lg51/b29053 Postgg On 30/05/2013
Bro. bBRbgbM .V                      Bro. bLbPPbN                         Pbstor. bLgRgg PRbgbSbM
NO:18,PgRSnbRbN                      NO.60, LORONg SgRbn PgRMbn 9,        1-2-2, MggbN nNTbN bPbRTMgNT,
RnSgbg .7                            TbMbN SgRbn PgRMbn,                  gbLbN 1/21g Ogg gbLbN gOMBbK
TbMbN RnSgbg                         34300, BbTbN SgRbn,                  53000 KUbLb LUMPUR
30100 nPOg, PgRbK                    PgRbK                                MbLbYSnb
MbLbYSnb                             MbLbYSnb


LR510b13172 Postgg On 30/05/2013     ML51/b9877 Postgg On 30/05/2013      LR51/b9905 Postgg On 30/05/2013
Sns. bLLbMbg (b) NgSbM               Bro. bLVnN bNbNg .b                  Mrs. bNnTgb VngTOR
NO:44,gbLbN gbMbn                    NO:3,gbLbN TgRbTbn 3                 7,gbLbN PbRn
TbMbN TbPbg gbYb                     TbMbN SbRn,TgRbTbn                   PbRn gbRggNS
35000 TbPbg                          44000 KUbLb KUBU BgbRU               nPOg,30100
PgRbK,                               SgLbNgOR                             PgRbK
MbLbYSnb                             MbLbYSnb                             MbLbYSnb


ML51/b13180 Postgg On 30/05/2013     ML51/b13203 Postgg On 30/05/2013     g51/b9942 Postgg On 30/05/2013
Bro. bNTONY                          Bro. bNTONYSWbMY                     Pbstor. bROKnbNbTgbN
NO:399,LORONg KgNbVn 3/2b            LbgbNg gUSUN gURnbM                  NO:M4 g/7
TbMbN KgNbRn                         42700 BbNTnNg                        gbLbN PbNgbN nNgbg 4/1b
09000 KULnM                          SgLbNgOR g.g                         PbNgbN nNgbg
Kggbg                                MbLbYSnb                             55100,KUbLb LUMPUR
MbLbYSnb                                                                  MbLbYSnb

为了安全和隐私,我把字母打乱了。我想要的是每个地址都应该是这样的:

My New Line                          My New Line                          My New Line
g51/b18468 Postgg On 30/05/2013      N51/b39897 Postgg On 30/05/2013      LR51/b23428 Postgg On 30/05/2013
Rgv. XXXXX                           Mr. bBnMbNNbN.M                      Bro. bBRbgbM .S,
KbgbNg bSSgMBLY Og gOg,              LOT 92, KbMPUNg                      gRbgg gOMMUNnTY ggNTRg,
52, gLN. TnMUR,                      BbTU 4, 43950                        4, LORONg SS 23/6g,
POST BOX 20, 43007 KbgbNg            SUNgbn PgLnK                         47400 PgTbLnNg gbYb,
MbLbYSnb                             SgLbNgUR                             SgLbNgOR, W.MbLbYSnb
                                     MbLbYSnb                             MbLbYSnb

我不知道该怎么做。这里没有分隔符来标记开始和结束。

最佳答案

这是我在 Ruby 中的处理方式:

INPUT_FILE = 'test.txt'
OUTPUT_FILE = INPUT_FILE + '.new'
COLUMN_WIDTH = 37

File.open(OUTPUT_FILE, 'w') do |fo|
  # read using paragraph mode
  File.foreach(INPUT_FILE, '') do |paragraph_in|

    addr1_new_line = "My New Line"
    addr2_new_line = addr1_new_line
    addr3_new_line = addr1_new_line

    column1_new_line, column2_new_line, column3_new_line = [
      addr1_new_line,
      addr2_new_line,
      addr3_new_line
    ].map{ |nl|
      nl + (' ' * (COLUMN_WIDTH - nl.length))
    }

    fo.puts column1_new_line + column2_new_line + column3_new_line + "\n"
    fo.puts paragraph_in
  end
end

带有示例输出:

My New Line                          My New Line                          My New Line
g51/b18468 Postgg On 30/05/2013      N51/b39897 Postgg On 30/05/2013      LR51/b23428 Postgg On 30/05/2013
Rgv. XXXXX                           Mr. bBnMbNNbN.M                      Bro. bBRbgbM .S,
KbgbNg bSSgMBLY Og gOg,              LOT 92, KbMPUNg                      gRbgg gOMMUNnTY ggNTRg,
52, gLN. TnMUR,                      BbTU 4, 43950                        4, LORONg SS 23/6g,
POST BOX 20, 43007 KbgbNg            SUNgbn PgLnK                         47400 PgTbLnNg gbYb,
MbLbYSnb                             SgLbNgUR                             SgLbNgOR, W.MbLbYSnb
                                     MbLbYSnb                             MbLbYSnb

My New Line                          My New Line                          My New Line
ML51/b13179 Postgg On 30/05/2013     W51/b41363 Postgg On 30/05/2013      Lg51/b29053 Postgg On 30/05/2013
Bro. bBRbgbM .V                      Bro. bLbPPbN                         Pbstor. bLgRgg PRbgbSbM
NO:18,PgRSnbRbN                      NO.60, LORONg SgRbn PgRMbn 9,        1-2-2, MggbN nNTbN bPbRTMgNT,
RnSgbg .7                            TbMbN SgRbn PgRMbn,                  gbLbN 1/21g Ogg gbLbN gOMBbK
TbMbN RnSgbg                         34300, BbTbN SgRbn,                  53000 KUbLb LUMPUR
30100 nPOg, PgRbK                    PgRbK                                MbLbYSnb
MbLbYSnb                             MbLbYSnb

My New Line                          My New Line                          My New Line
LR510b13172 Postgg On 30/05/2013     ML51/b9877 Postgg On 30/05/2013      LR51/b9905 Postgg On 30/05/2013
Sns. bLLbMbg (b) NgSbM               Bro. bLVnN bNbNg .b                  Mrs. bNnTgb VngTOR
NO:44,gbLbN gbMbn                    NO:3,gbLbN TgRbTbn 3                 7,gbLbN PbRn
TbMbN TbPbg gbYb                     TbMbN SbRn,TgRbTbn                   PbRn gbRggNS
35000 TbPbg                          44000 KUbLb KUBU BgbRU               nPOg,30100
PgRbK,                               SgLbNgOR                             PgRbK
MbLbYSnb                             MbLbYSnb                             MbLbYSnb

My New Line                          My New Line                          My New Line
ML51/b13180 Postgg On 30/05/2013     ML51/b13203 Postgg On 30/05/2013     g51/b9942 Postgg On 30/05/2013
Bro. bNTONY                          Bro. bNTONYSWbMY                     Pbstor. bROKnbNbTgbN
NO:399,LORONg KgNbVn 3/2b            LbgbNg gUSUN gURnbM                  NO:M4 g/7
TbMbN KgNbRn                         42700 BbNTnNg                        gbLbN PbNgbN nNgbg 4/1b
09000 KULnM                          SgLbNgOR g.g                         PbNgbN nNgbg
Kggbg                                MbLbYSnb                             55100,KUbLb LUMPUR
MbLbYSnb                                                                  MbLbYSnb

诀窍是在阅读行时将 Ruby 置于“段落”模式。许多 IO 和 File 方法都有行分隔符的概念,也就是神奇的 $/ 变量。通过传入不同的值,Ruby 将以不同的方式读取或写入文本文件。在这种情况下,通过传入空字符串,它将以“段落”模式读取,这意味着读取“行”,直到找到两个连续的“\n”。在大多数文本中,“\n\n”标记一个新段落。

这样做的副作用是我们不需要关心或知道一个段落由多少行组成,因为 Ruby 会一直读取直到找到“\n\n ",自动做正确的事。我们只关心 Ruby 说它找到了另一个段落。

一旦 Ruby 阅读了一个段落,创建要输出的新行、确定列宽并输出新行后跟之前阅读的段落是一项非常简单的任务。

我允许每行和每列有不同的标题。您可以根据需要调整 addr1_new_lineaddr2_new_lineaddr3_new_line 值。只要列宽小于列宽,代码就会根据需要自动调整列宽以保持对齐。

关于ruby - 为三列中的每一列中的每个地址添加一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16919802/

相关文章:

ruby-on-rails - 在 Ruby 中计算大量 Lat/Lngs 到一组 2000 Lat/Lngs

ruby-on-rails - 在子 Controller 中的 Action 之前跳过

python-3.x - 如何在文本文件上编写控制台输出

python 滚动解决方法

ruby - 如何判断方法或循环是否已完成?

ruby-on-rails - id 列中的基值但限制为非空

git - 自定义 Git 命令在执行 git diff 后死于信号 13 (SIGPIPE)

c - 关于用 C 语言为 FreeBSD 开发命令行应用程序的权威书籍是什么?

grep - 如何截断 grep 或 ack 返回的长匹配行

batch-file - 如何批量读取包含空行的文本文件?