导轨5.2-检测字段中的内容类型



允许用户上传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'

如果您需要不同的内容(例如日期,电话号码或任何具有某种模式的内容),则可以使用不同的正则表达式。

最新更新