我有一个文件需要用-
分割,然后分成两组,每16个字符/数字需要添加一行
文件的原貌:
aaa 3aaa aaa a4aaa b1bbbb2bbbbbb bb c 4cccc cc c5ccc cc
文件的预期输出:
aa - a3 - aa - aa - aa - a4 - aa - aa b1 - bb - bb- 2b- bb - bb - bb - bb cc - 4c - cc - cc - cc - cc - 5c - cc
我做了很多研究,发现使用.split(" - ")
会与-
进行分割,但我如何将这些字符分组为“捆绑”?
到目前为止,我已经尝试.gsub(/\[a-zA-Z]/)
显然没有用,因为我对正则表达式很糟糕。
我也尝试使用.split("\n")
来查看我是否能够将文件拆分成行,然后找出一种分组方式。
答案 0 :(得分:1)
我想你可能想尝试使用scan方法将字符串分成2个字符组。 然后,您可以在for循环中进行一些文本更改,以添加新的换行符。 我在想这样的事情:
fileString = "aa - a3 - aa - aa - aa - a4 - aa - a
b1b - b - bb- 2b- bbb - bb - b - b
c - 4c - c - ccc - c - c - 5 - ccc - cc"
fileArray = fileString.gsub(/\r/," ").gsub(/\n/," ").gsub("-", "").gsub(" ", "").scan(/../)
for i in (fileArray.length-1).downto(0)
if i % 15 == 0 && i != 0
fileArray[i] = "\n"+fileArray[i]
end
end
fileString = fileArray.join(" ")
修改强>
另一种选择少用gsub&b; bing可以如下:
fileString = "aa - a3 - aa - aa - aa - a4 - aa - a
b1b - b - bb- 2b- bbb - bb - b - b
c - 4c - c - ccc - c - c - 5 - ccc - cc"
fileArray = fileString.strip().gsub(/([\- ])/,"").scan(/../)
for i in (fileArray.length-1).downto(0)
if i % 15 == 0 && i != 0
fileArray[i] = "\n"+fileArray[i]
end
end
fileString = fileArray.join(" ")
答案 1 :(得分:1)
如果您的文件已经按照您在输入中显示的正确数量分组,我将如何处理它。如果不是这种情况,请告诉我,我可以解决它。
#Example input
input = "aaa 3aaa aaa a4aaa
b1bbbb2bbbbbb bb
c 4cccc cc c5ccc cc"
#Prints the output
puts input.split("\n").map{|line| line.gsub(/\s+/, "").scan(/.{1,2}/).join(' - ')}.join("\n")
首先将文件拆分为新行,然后按每行删除空格,根据您的示例,您似乎不计算这些空间,然后将它们分成两组,并合并这些组用破折号和空格。最后,它将所有行连接回一个字符串,但将新行字符重新放入,以便正确显示。
根据您的评论,您的输入尚未按大小分组,您可以尝试:
input = "aaa 3aaa aaa a4aaa b1bbbb2bbbbbb bb c 4cccc cc c5ccc cc"
puts input.gsub(/\s+/, "").scan(/.{1,16}/).map{ |line| line.scan(/.{1,2}/).join(' - ') }.join("\n")
输出:
aa - a3 - aa - aa - aa - a4 - aa - ab
1b - bb - b2 - bb - bb - bb - bb - c4
cc - cc - cc - c5 - cc - cc - c
它的工作方式与上一个相同,但按组分组最多16个字符而不是新行字符。
答案 2 :(得分:1)
@ rp.beltran的例子:
input = "aaa 3aaa aaa a4aaa
b1bbbb2bbbbbb bb
c 4cccc cc c5ccc cc"
首先删除空格和换行符:
str = input.gsub(/[\s\n]/, '')
#=> "aaa3aaaaaaa4aaab1bbbb2bbbbbbbbc4ccccccc5ccccc"
现在计算行数并将每个行映射到所需的字符串:
(str.size/16.0).ceil.times.map { |i| str[i*16, 16].scan(/..?/).join(' - ') }
#=> ["aa - a3 - aa - aa - aa - a4 - aa - ab",
# "1b - bb - b2 - bb - bb - bb - bb - c4",
# "cc - cc - cc - c5 - cc - cc - c"]
注意:"cat"[1, 9999] #=> "at"
。