每两个字符/数字拆分一个文件,每16个双字符/数字添加一行

时间:2015-12-30 20:35:08

标签: ruby file split

我有一个文件需要用-分割,然后分成两组,每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")来查看我是否能够将文件拆分成行,然后找出一种分组方式。

3 个答案:

答案 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"