我正在阅读带有RoR的CSV文件并打印出一个HTML表,但需要标记2个单独列的值何时与另一行匹配。
CSV看起来像
name | value1 | value2| value3
bob | 2 | 3 | foo
jim | 4 | 5 | bar
tim | 2 | 7 | foo
我想找到VALUE1和VALUE3匹配此CSV文件中另一行的VALUE1和VALUE3的值(在这种情况下:" 2"&" foo"匹配鲍勃和蒂姆)
结果如下:
name | value1 | value2| value3 | duplicate
bob | 2 | 3 | foo | Y
jim | 4 | 5 | bar | N
tim | 2 | 7 | foo | Y
我打印出桌子
<% file.each do |row| %>
<tr>
<% row.each do |k, v| %>
<td><% v %></td>
<% end %>
</tr>
<% end %>
我想要做的是在找到匹配的列时标记表格行。
答案 0 :(得分:1)
上面的答案的另一个版本,用普通红宝石而不是ERB,所以它更容易测试
我想展示我的小红宝石程序来展示我是如何做到这一点的。在ERB版本中读取并不容易,可以将其复制并粘贴到IRB中或通过管道传输到文件中。
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 :(得分:0)
我想起某个XKCD漫画,关于确定照片是否在国家公园拍摄, 如果照片是一只鸟...... LOL
因此,您需要更复杂的数据结构来比较每一行与之前的所有行。 好的,最终编辑:我添加的代码只设置一个新颜色,如果这是第一次重复一组值,那么如果它再次重复,它将获得相同的颜色。还添加了代码,用于附加显示哪些行也匹配的列。
<% 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),然后复制先前检查过的行数组中的新行。
如果一行匹配多次,则会中断,因为它只会为新匹配和前一个匹配相同的颜色。但是我添加了一个最后一列,告诉你每个匹配的行。因此,如果突出显示,您可以跳回该行。
还有其他方法可以进行突出显示,也许可以向前复制新颜色,这样两行完全相同的颜色就会是相同的颜色。