【问题标题】:How to escape array iteration when exporting to .csv and fill columns with the iteration result only?导出到 .csv 并仅用迭代结果填充列时如何转义数组迭代?
【发布时间】:2021-12-28 10:59:44
【问题描述】:

如果有更好的方法来询问这个问题,我们深表歉意。

我正在尝试将 User 数据导出到 .csv 文件,但在遍历数组时遇到问题。我在一列中获取整个数组的内容,而在以下列中没有任何内容。示例:

假设我有标题CompanyCountry

<% headers = [
  ... # some other headers
  "Company",
  "Country"
  ] %>

<%= CSV.generate_line(headers, row_sep:"", col_sep: ",") %>

然后我有一个字符串数组,其中包含Company 名称和Country 的用户值,我必须用正确的值填充文件中的相应列。

<% @user_preferences = ["Microsoft", "USA"] %>

我正在做类似的事情

<%= CSV.generate_line([
  ... # some other fields
  @user_preferences.each do |value|
    value
  end
], row_sep:"", col_sep: ",").html_safe %>

但是,我没有在不同的列中获取每个 value,而是在第一列 (Company) 中获取 ["Microsoft", "USA"],而在 Country 列中没有任何内容。

我的理解是,它在进入迭代块之前用 @user_preferences 返回的任何内容填充第一列,而不是将每个 value 分配给单独的列。

我尝试使用哈希而不是数组,但在遍历它的键/值时得到相同的结果(我在同一列中得到两个值)。

有没有办法转义迭代并用正确的值填充每一列?

【问题讨论】:

  • “我正在尝试将用户数据导出到 .csv 文件” - 但您的代码看起来像是在尝试将 CSV 输出写入 HTML 模板。
  • 是的,.csv 就像任何其他 html.erb 视图一样。但不是渲染它,而是给出下载提示。

标签: ruby-on-rails ruby loops csv export-to-csv


【解决方案1】:

看起来您正试图将一个数组的内容拼接到另一个数组字面量中。您可以为此使用 splat 运算符:

<%= CSV.generate_line([:some, :other, :fields, *@user_preferences],
                      row_sep:"", col_sep: ",").html_safe %>

相当于这样:

[:some, :other, :fields, *["Microsoft", "USA"]]

这给出了:

[:some, :other, :fields, "Microsoft", "USA"]

【讨论】:

  • 第一个 CSV.generate_line 创建第一行标题。第二个在每个标题下生成包含User 数据的每一行。我在遍历数组时遇到的问题是,我没有将数组的每个值都放在相应的标题下,而是在第一个标题下得到所有值,而在后面的标题中什么也没有。
  • @pinkfloyd90 您尝试了建议的修复方法吗?
  • @Stefan 我选择在CSV.generate_line 之外构建行内容数组,然后将整个数组传递给它。
  • @pinkfloyd90 问题是您将 @user_preferences 数组添加到行数组而不是添加其元素。 (这是 splat 运算符 * 实现的)希望你能解决它。
猜你喜欢
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多