我需要在以下格式的文本文件中的每个地址的顶部添加一行:
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
我不知道该怎么做。此处没有分隔符标记开始和结束。
答案 0 :(得分: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
替换为文件,数组等输出。
答案 1 :(得分:1)
要在每条记录之前添加一行,请先将工具置于段落模式。这通常通过设置空记录分隔符来完成。然后在打印记录之前打印您的行。以下是使用awk
:
awk '{ print (NR > 1 ? "\n\n" : "") "NEW\t\tNEW\t\tNEW" ORS $0 }' RS= file
由于您的列是固定宽度的,因此您需要调整空白的数量以便更新。我会留给你的。 HTH。
答案 2 :(得分: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
使用示例输出:
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方法都有一个行分隔符的概念,AKA是一个神奇的$/
变量。通过传递不同的值,Ruby将以不同的方式读取或写入文本文件。在这种情况下,通过传入一个空字符串,它将以“段落”模式读取,这意味着读取“行”直到找到两个连续的“\ n”。在大多数文本中,“\ n \ n”标记一个新段落。
这样做的副作用是我们不需要关心或知道,有多少行组成一个段落,因为Ruby会一直读到“\ n \ n “,自动做正确的事。我们只关心Ruby说它发现了另一段。
一旦Ruby读了一个段落,创建要输出的新行,确定列宽,然后输出新行,然后输出先前读过的段落,这是一个非常简单的任务。
我允许每个行和列有不同的标题。您可以根据需要调整addr1_new_line
,addr2_new_line
和addr3_new_line
值。代码将根据需要自动调整列宽,以使它们保持对齐,只要它们短于列宽。
答案 3 :(得分: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}