1

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

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

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

4

4 回答 4

1

以下是我在 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

带样本输出:

我的新线 我的新线 我的新线
g51/b18468 Postgg 开启 30/05/2013 N51/b39897 Postgg 开启 30/05/2013 LR51/b23428 Postgg 开启 30/05/2013
Rgv。XXXXX 先生 bBnMbNNbN.M 兄弟。bBRbgbM .S,
KbgbNg bSSgMBLY Og gOg,LOT 92,KbMPUNg gRbgg gOMMUNnTY ggNTRg,
52, 液氮。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 开启 30/05/2013 W51/b41363 Postgg 开启 30/05/2013 Lg51/b29053 Postgg 开启 30/05/2013
兄弟。bBRbgbM .V 兄弟。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

我的新线 我的新线 我的新线
LR510​​b13172 Postgg 开启 30/05/2013 ML51/b9877 Postgg 开启 30/05/2013 LR51/b9905 Postgg 开启 30/05/2013
Sns。bLLbMbg (b) NgSbM 兄弟。bLVnN bNbNg .b 夫人 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 开启 30/05/2013 ML51/b13203 Postgg 开启 30/05/2013 g51/b9942 Postgg 开启 30/05/2013
兄弟。安东尼兄弟 bNTONYSWbMY Pbstor。破碎的NbTgbN
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 gg PbNgbN nNgbg
Kggbg MbLbYSnb 55100,KUbLb LUMPUR
MbLbYSnb MbLbYSnb

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

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

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

我允许每一行和每一列都有不同的标题。您可以根据需要调整和addr1_new_line值。代码将根据需要自动调整列宽以保持对齐,只要它们比列宽短。addr2_new_lineaddr3_new_line

于 2013-06-04T15:06:08.107 回答
1

用地址文件中的行以一种或另一种方式填充数组lines,然后:

new_line = 'My New Line                          My New Line                          My New Line'
lines.each_with_index do |line, index|
  if index.zero? or lines[index-1].blank?
    puts new_line
  end
  puts line
end

您可以根据puts需要将 替换为文件、数组等的输出。

于 2013-06-04T14:04:06.933 回答
1

要在每条记录之前添加一行,请先将您的工具置于段落模式。这通常通过设置空记录分隔符来完成。然后在打印记录之前打印您的行。以下是您可以使用以下方法执行此操作的方法awk

awk '{ print (NR > 1 ? "\n\n" : "") "NEW\t\tNEW\t\tNEW" ORS $0 }' RS= file

由于您的列是固定宽度的,因此您需要调整空白的数量以整理内容。我会把它留给你。HTH。

于 2013-06-04T14:22:44.143 回答
0

只是另一种方式(假设输入文本addr并且它在每个段落中都有固定数量的行):

str = "My New Line                          My New Line                          My New Line\n"
new_addr = addr.lines.each_slice(9).map{|el| str + el.join}
于 2013-06-04T17:24:56.980 回答