我有一个包含整数块的文件(InputFile.txt
),每个块使用*
字符进行拆分。每个块包含一些行,每行包含三个整数,例如:
4 1233 8
2 55 11
2 4 33
*
3 5 34
2 1 44
6 5 33
*
我想读取每个块并将每个块中的整数放在2D数组中并对其进行一些处理。我找到了以下代码:
f = File.read 'InputFile.txt'
f.split('*').each do |set|
set.split.map(&:to_i)
这段代码可以读取每个块,但我不知道如何将每个块放在2D数组中。我尝试了例如set[0][0]
并返回4,但是当我尝试设置[0] [1]时,它返回空格。谁能告诉我该怎么办?我想将1233
视为第二个数字。
答案 0 :(得分:3)
f = File.read 'InputFile.txt'
data_array = f.split('*').map do |block|
block.split(/\n+/)
.map { |e| e.split(/\s+/)
.map(&:to_i) }
.reject { |a| a.empty? }
end
# => [[[4, 1233, 8], [2, 55, 11], [2, 4, 33]],
# [[3, 5, 34], [2, 1, 44], [6, 5, 33]]]
这适用于由blocks
分隔的任意数量的*
。并且,在每个块中,rows
由任意数量的新行分隔,并且在每行中,integer
元素由任意数量的空格分隔。
因为,每个块都是graph
,每个row
中的三个元素分别代表source_node
,dest_node
和weight
,因此,要访问这些信息,您可以执行以下操作:
data_array.each_with_index do |row, index|
p "Graph: #{index}"
row.each do |inner_row|
p "source_node: #{inner_row[0]}, dest_node: #{inner_row[1]}, weight: #{inner_row[2]}"
end
p '- - -'
end
# => "Graph: 0"
# "source_node: 4, dest_node: 1233, weight: 8"
# "source_node: 2, dest_node: 55, weight: 11"
# "source_node: 2, dest_node: 4, weight: 33"
# "- - -"
# "Graph: 1"
# "source_node: 3, dest_node: 5, weight: 34"
# "source_node: 2, dest_node: 1, weight: 44"
# "source_node: 6, dest_node: 5, weight: 33"
答案 1 :(得分:2)
如果文件不是太大,你可以只是" gulp"把它分成一个字符串,在星号上分开(每边都有空格),然后分解它们。
让我们先将一些数据写入文件:
str =<<-BITTER_END
4 1233 8
2 55 11
2 4 33
*
3 5 34
2 1 44
6 5 33
*
5 4 1
22 65 98
13 15 71
BITTER_END
FName = 'temp'
IO.write(FName, str) #=> 75
现在我们阅读并处理文件:
IO.read(FName).
split('*').
map { |s| s.strip.split(/\n+/).map { |s| s.strip.split.map(&:to_i) } }
#=> [[[4, 1233, 8], [2, 55, 11], [2, 4, 33]],
# [[3, 5, 34], [2, 1, 44], [6, 5, 33]],
# [[5, 4, 1], [22, 65, 98], [13, 15, 71]]]
这是另一个写的。它更冗长,但它使它自我记录,便于调试和测试,并提高可维护性:
class String
def to_blocks(split_char)
split(split_char)
end
def to_lines
strip.split(/\n+/)
end
def to_arr_of_ints
strip.split.map(&:to_i)
end
end
然后:
IO.read(FName).to_blocks('*').map { |block|
block.to_lines.map { |line|
line.to_arr_of_ints } }
#=> [[[4, 1233, 8], [2, 55, 11], [2, 4, 33]],
# [[3, 5, 34], [2, 1, 44], [6, 5, 33]],
# [[5, 4, 1], [22, 65, 98], [13, 15, 71]]]
如果你不想修补String
,你可以使用Refinements,或者只是将三个方法中的每个方法都设为一个字符串。
答案 2 :(得分:1)
f.split("*").each do |block|
result.push []
block.split("\n").each do |line|
result[-1].push line.split.map{ |i| i.to_i } unless line.split.size == 0
end
end
答案 3 :(得分:1)
修改代码以添加嵌套数组:
output = []
col = 0
row = 0
f = File.read 'InputFile.txt'
f.split('*').each do|set|
output[row] = []
set.split(' ').each do|item|
output[row][col] = item
col += 1
end
row +=1
col = 0
end
print output
结果:
[["4", "1233", "8", "2", "55", "11", "2", "4", "33"], ["3", "5", "34", "2", "1", "44", "6", "5", "33"]]
确保没有尾随*否则会创建一个空的内部数组。也不确定你是否想要在自己的数组中使用每个新的数字行,或者直到下一个星号读取。我一直读到直到星号。