使用扁平化!在数组数组上不起作用
Using flatten! on an array of arrays not working
我正在构建一个脚本,该脚本从可以包含 0 个或多个 ID 号的 CSV 中获取一列。我已经创建了一个列数组,但是,由于有些单元格没有 ID 号,有些单元格有多个,所以我有一个数组数组。
我想创建一个数组,其中每个元素都是一个 ID(即将数组中每个元素的 ID 拆分为一个元素)。
到目前为止,这是我的代码:
require 'csv'
class MetadataTherapyParser
def initialize (csv)
@csv = csv
end
def parse_csv
therapy_array = []
CSV.foreach(@csv) do |csv_row|
therapy_array << csv_row[0]
end
therapy_array
end
def parse_therapies(therapy_array)
parsed_therapy_array = therapy_array.flatten!
end
end
metadata_parse = MetadataTherapyParser.new ("my_path.csv")
therapy_array = metadata_parse.parse_csv
metadata_parse.parse_therapies(therapy_array)
p therapy_array
但是,输出仍然是数组的数组。我认为这可能与 nil 值有关?我尝试在网上寻找答案无济于事。
如果您能给我一些解决此问题的建议,将不胜感激!
提前谢谢你。
编辑
我在下面发布了我的输出片段。它仍然看起来是一个嵌套数组。
[nil, nil, "57e923a0f5c3c85c9200052b, 58b828f4f5c3c806490046a6", "57e923a0f5c3c85c9200052b, 4ffaf15af758862fb10155e3, 58b828f4f5c3c806490046a6", "57e923a0f5c3c85c9200052b, 4ffaf15af758862fb10155e3, 58b828f4f5c3c806490046a6", nil, nil, nil, nil, nil, "5f9176e50cf19216d6da9289", "6082f6bd0cf19225863fc985", "6082f6fd0cf192258d3fce0e", "6082f69e0cf19225ac3fc551", "6082f6a60cf19225a23fd3e4, 6082f6d30cf192258d3fce0a, 6082f7fa0cf19225953fc77c"]
你说你有“数组的数组”,但你的示例数组是 "57e923a0f5c3c85c9200052b, 4ffaf15af758862fb10155e3, 58b828f4f5c3c806490046a6"
...那不是数组。那是一个字符串。您可能希望将包含逗号的字符串拆分为单独的数组元素。
所以不用
therapy_array << csv_row[0]
试试看
therapy_array << csv_row[0].to_s.split(',').map(&:strip)
flatten
运行良好。您遇到的问题是您的输出中有很多字符串,其中包含逗号。
由于没有您的 CSV 副本,我假设它已被正确解析,并且您确实希望保持第一个单元格的内容不变:
def parse_therapies(therapy_array)
parsed_therapy_array = therapy_array.map { |x| x && x.split(/,/) }.flatten.compact
therapy_array.replace(parsed_therapy_array)
end
这也将删除所有 nil
元素,假设您不需要它们,使用 compact
过程。
我正在构建一个脚本,该脚本从可以包含 0 个或多个 ID 号的 CSV 中获取一列。我已经创建了一个列数组,但是,由于有些单元格没有 ID 号,有些单元格有多个,所以我有一个数组数组。
我想创建一个数组,其中每个元素都是一个 ID(即将数组中每个元素的 ID 拆分为一个元素)。
到目前为止,这是我的代码:
require 'csv'
class MetadataTherapyParser
def initialize (csv)
@csv = csv
end
def parse_csv
therapy_array = []
CSV.foreach(@csv) do |csv_row|
therapy_array << csv_row[0]
end
therapy_array
end
def parse_therapies(therapy_array)
parsed_therapy_array = therapy_array.flatten!
end
end
metadata_parse = MetadataTherapyParser.new ("my_path.csv")
therapy_array = metadata_parse.parse_csv
metadata_parse.parse_therapies(therapy_array)
p therapy_array
但是,输出仍然是数组的数组。我认为这可能与 nil 值有关?我尝试在网上寻找答案无济于事。
如果您能给我一些解决此问题的建议,将不胜感激!
提前谢谢你。
编辑 我在下面发布了我的输出片段。它仍然看起来是一个嵌套数组。
[nil, nil, "57e923a0f5c3c85c9200052b, 58b828f4f5c3c806490046a6", "57e923a0f5c3c85c9200052b, 4ffaf15af758862fb10155e3, 58b828f4f5c3c806490046a6", "57e923a0f5c3c85c9200052b, 4ffaf15af758862fb10155e3, 58b828f4f5c3c806490046a6", nil, nil, nil, nil, nil, "5f9176e50cf19216d6da9289", "6082f6bd0cf19225863fc985", "6082f6fd0cf192258d3fce0e", "6082f69e0cf19225ac3fc551", "6082f6a60cf19225a23fd3e4, 6082f6d30cf192258d3fce0a, 6082f7fa0cf19225953fc77c"]
你说你有“数组的数组”,但你的示例数组是 "57e923a0f5c3c85c9200052b, 4ffaf15af758862fb10155e3, 58b828f4f5c3c806490046a6"
...那不是数组。那是一个字符串。您可能希望将包含逗号的字符串拆分为单独的数组元素。
所以不用
therapy_array << csv_row[0]
试试看
therapy_array << csv_row[0].to_s.split(',').map(&:strip)
flatten
运行良好。您遇到的问题是您的输出中有很多字符串,其中包含逗号。
由于没有您的 CSV 副本,我假设它已被正确解析,并且您确实希望保持第一个单元格的内容不变:
def parse_therapies(therapy_array)
parsed_therapy_array = therapy_array.map { |x| x && x.split(/,/) }.flatten.compact
therapy_array.replace(parsed_therapy_array)
end
这也将删除所有 nil
元素,假设您不需要它们,使用 compact
过程。