使用扁平化!在数组数组上不起作用

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 过程。