允许用户上传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位数字'。
您可以使用正则表达式:
def type_sense(content)
case content
when /Ad+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 /Ad+z/ then 'Number' #matches a string with only digits in it
when /A[a-zA-Zs]+z/ then 'Text'
else 'Unknown'
如果您需要不同的内容(例如日期,电话号码或任何具有某种模式的内容),则可以使用不同的正则表达式。