允许用户上传CSV,然后输出一个CSV示例供他们验证。为此,我想在其旁边添加“猜测”字段类型(字符串,数字等-高级)。
当前我正在使用:
查看
<p>
<strong>Spec Sheet SAMPLE (Live Data):</strong>
<%#= image_tag url_for(@post.cover_photo) %>
<% preview_data = CSV.foreach(ActiveStorage::Blob.service.send(:path_for, @post.cover_photo.blob.key)).take(10) %>
<table style="width:50%">
<tr>
<% preview_data[0].each do |header| %>
<th><%= header %> </th>
<% end %>
</tr>
<% preview_data.drop(1).each do |row| %>
<tr>
<% row.each do |info| %>
<td><%= info %> <%= type_sense(info) %></td>
<% end %>
</tr>
<% end %>
</table>
</p>
控制器
def type_sense(content)
if content.is_a? Integer
return 'Number'
elsif content.is_a? String
return 'Text'
end
end
helper_method :type_sense
我了解到-从技术上讲,通过CSV制作的数组中的所有内容都是字符串。
我注意到,文件上传后,所有内容都被双引号引起了,我假设尽管它被还原为原始值,但仍将其转换为字符串。
注意我确实知道它会错误地将某些内容标记为其他内容,但是对于此测试用例,我只是想让它将9位数字注册为“整数”,并将字母注册为“文本” '。
答案 0 :(得分:1)
您可以使用正则表达式:
def type_sense(content)
case content
when /\A\d+\z/ then 'Number' #matches a string with only digits in it
else 'Text' #if it's not a number, then it's text, I guess you want to count "some123thing" as text
end
end
如果您只想将字母(和空格?)记为“文本”,请使用
when /\A\d+\z/ then 'Number' #matches a string with only digits in it
when /\A[a-zA-Z\s]+\z/ then 'Text'
else 'Unknown'
如果您需要不同的内容(例如日期,电话号码或任何具有某种模式的东西),则可以使用不同的正则表达式进行播放