首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Rails中查找2列的匹配值

在Rails中查找2列的匹配值
EN

Stack Overflow用户
提问于 2015-01-06 17:06:54
回答 2查看 1.4K关注 0票数 0

我正在用RoR读取一个CSV文件,并打印出一个HTML,但是当两个单独的列的值与另一个行匹配时,需要标记。

CSV看起来就像

代码语言:javascript
复制
name | value1 | value2| value3
bob  |    2   |   3   |   foo
jim  |    4   |   5   |   bar
tim  |    2   |   7   |   foo

我想知道VALUE1和VALUE3何时匹配这个CSV文件中另一行的VALUE1和VALUE3的值(在本例中:"2“和"foo”匹配在bob和VALUE3上)

其结果可能是:

代码语言:javascript
复制
name | value1 | value2| value3 | duplicate
bob  |    2   |   3   |   foo  |   Y
jim  |    4   |   5   |   bar  |   N
tim  |    2   |   7   |   foo  |   Y

我要把桌子打印出来

代码语言:javascript
复制
<% file.each do |row| %>
<tr>
  <% row.each do |k, v| %>
    <td><% v %></td>
  <% end %>
</tr>
<% end %>

当我找到匹配的列时,我想做的是标记表行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 04:56:51

是上述答案的另一个版本,使用的是简单的红宝石,而不是ERB,因此更容易测试

我想展示我的小红宝石程序来展示我是如何做到的。在再培训局版本中,阅读起来不那么容易,这可以复制并粘贴到IRB中,或者通过管道传输到文件中。

代码语言:javascript
复制
 puts '<head></head>'
 puts '<body>'
 puts '<table>'
 puts '<tr><th>#</th><th>col1</th><th>col2</th><th>col3</th><th>col4</th><th>Matching Previous Rows:</th></tr>'

file = [%w(Bob foo 32 3), %w(Joe zip 4 foo), %w(Joe baz 4 foo), %w(Steve foo 44 3), %w(Bob baz 32 foo), %w(Mary baz 4 wow), %w(Lisa 34 wow 2), %w(Art 45 foo E),%w(Bob foo 32 3)]
output_file = []

 file.each do |row|
 row.unshift 0x00FFFF  #make first value the background color of 0xFFFFFF
 row.push ''            #add a column for matches
 output_file.each_with_index do |prev_row,i|   # look for current row values in previous entries
      if prev_row[2] == row[2] and prev_row[4] == row[4]
        if prev_row[0] == 0x00FFFF
          prev_row[0] = rand(0xFFFF0)
          row[0] = prev_row[0]
        else
          row[0] = prev_row[0]
        end
        row[-1] += "#{(i + 1)}, "
      end
     end
 output_file << row               #add the new row to the look-back array

 end

 output_file.each_with_index do |output_row,i|
   print "<tr bgcolor=##{output_row[0].to_s(16).upcase}F  >"
   output_row.shift
   print "<td>#{i + 1}</td>"
  output_row.each do |v|           #why the k? you don't use it here.
     print '<td>' + "#{v}" + ' </td>'
  end
  puts '</tr>'
 end
 puts '</table>'
 puts '</body>'

票数 1
EN

Stack Overflow用户

发布于 2015-01-06 19:20:41

我想起了一部XKCD漫画,它是关于确定一张照片是否是在国家公园拍摄的,如果照片是一只鸟的话.LOL

因此,您需要一个更复杂的数据结构来对每一行和前面的所有行进行比较。OK,最后编辑:添加了代码,只有在一组值第一次重复时才设置新颜色,这样如果它再次重复,就会得到相同的颜色。还添加了附加列的代码,这些列显示哪些行也匹配。

代码语言:javascript
复制
<% output_file = [] %>  
<%  color_offset = 26214 %>

<%  file.each do |row| %>
  <%  row.unshift 0x00FFFF     # add last 4 digits of bgcolor as first item in each row   %>
  <%  row.push ''       #add a column at the end for row match numbers  
  <%  output_file.each_with_index do |prev_row,i| # look for current row values in previous entries  %>

    <%  if prev_row[2] == row[2] and prev_row[4] == row[4]  %>
          <% if prev_row[0] == 0x00FFFF %>
            <%  prev_row[0] -= color_offset  %>
            <%  row[0] = prev_row[0]   %>
          <% else %>
            <% row[0] = prev_row[0] %>
          <% end %>

          <%  color_offset -= 52     %>
          <%  row[-1] += "#{(i + 1)}, "  %>
    <%  end   %>       
   <%  end %>

  <%  output_file << row   # add the new row to the look-back array %>

<%  end  %>

<%  output_file.each do |output_row|  %>
     <tr bgcolor=#FF<% output_row[0].to_s(16).upcase %>  >
     <% output_row.shift %>
     <% output_row.each do |v|    # why the k? you don't use it here.  %>            
     <td> <% v %> </td>                
     <%  end   %> 
     </tr>
<%  end    %>

因此,您取每一行,循环遍历先前检查过的行数组,如果匹配,则将它们的第一项更改为匹配的4位数字颜色(G和B,R在末尾添加),然后将新行复制到先前检查过的行数组中。

如果一行超过一次匹配,这会中断,因为它只会给新的匹配和前一匹配提供相同的颜色。但是我添加了最后一列,它告诉您前面匹配的是哪一行。因此,如果突出显示,您可以跳回该行。

有其他的方法来做高亮,也许复制新的颜色向前,这样两个以上的完全相同的行将是相同的颜色。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27803610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档