我正在用RoR读取一个CSV文件,并打印出一个HTML,但是当两个单独的列的值与另一个行匹配时,需要标记。
CSV看起来就像
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上)
其结果可能是:
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 %>当我找到匹配的列时,我想做的是标记表行。
发布于 2015-01-08 04:56:51
是上述答案的另一个版本,使用的是简单的红宝石,而不是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>'

发布于 2015-01-06 19:20:41
我想起了一部XKCD漫画,它是关于确定一张照片是否是在国家公园拍摄的,如果照片是一只鸟的话.LOL
因此,您需要一个更复杂的数据结构来对每一行和前面的所有行进行比较。OK,最后编辑:添加了代码,只有在一组值第一次重复时才设置新颜色,这样如果它再次重复,就会得到相同的颜色。还添加了附加列的代码,这些列显示哪些行也匹配。
<% 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在末尾添加),然后将新行复制到先前检查过的行数组中。
如果一行超过一次匹配,这会中断,因为它只会给新的匹配和前一匹配提供相同的颜色。但是我添加了最后一列,它告诉您前面匹配的是哪一行。因此,如果突出显示,您可以跳回该行。
有其他的方法来做高亮,也许复制新的颜色向前,这样两个以上的完全相同的行将是相同的颜色。
https://stackoverflow.com/questions/27803610
复制相似问题