如何从没有列名的文件中保存数据?

时间:2016-05-25 05:22:10

标签: ruby-on-rails ruby ruby-on-rails-4

我有以下字段的表格:

# == Schema Information
#
# Table name: scheme_details
#
#  id               :integer          not null, primary key
#  scheme_id        :integer          not null
#  nav_date         :datetime
#  nav_price        :float
#  repurchase_price :float
#  sale_price       :float
#  closing_date     :datetime
#  net_change       :float
#  prev_nav         :float
#  prev_nav_date    :datetime
#  upd_flag         :string(1)
#  created_at       :datetime         not null
#  updated_at       :datetime         not null
#  change           :float
#

现在我从ftp服务器获取一个文件扩展名为ace的数据文件,该文件没有列名。

以下是文件的示例数据。

<<row>>1|5/24/2016 12:00:00 AM|1000.49|1000.49|1000.49||0|0|1000.49|5/23/2016 12:00:00 AM|A<</row>>
<<row>>2|5/24/2016 12:00:00 AM|2350.0193|2350.0193|2350.0193||0.0210084954593086|0.493599999999788|2349.5257|5/23/2016 12:00:00 AM|A<</row>>
<<row>>3|5/24/2016 12:00:00 AM|1005.4653|1005.4653|1005.4653||0.0210096133902824|0.211199999999963|1005.2541|5/23/2016 12:00:00 AM|A<</row>>
<<row>>4|5/24/2016 12:00:00 AM|1001.2549|1001.2549|1001.2549||0.0210080549857693|0.210300000000075|1001.0446|5/23/2016 12:00:00 AM|A<</row>>
<<row>>9|5/24/2016 12:00:00 AM|1005.428|1005.428|1005.428||0.0208611403115122|0.209699999999998|1005.2183|5/23/2016 12:00:00 AM|A<</row>>
<<row>>10|5/24/2016 12:00:00 AM|2226.3533|2226.3533|2226.3533||0.0208725620468016|0.464600000000246|2225.8887|5/23/2016 12:00:00 AM|A<</row>>
<<row>>11|5/24/2016 12:00:00 AM|1001.2478|1001.2478|1001.2478||0.0208683199024505|0.208899999999971|1001.0389|5/23/2016 12:00:00 AM|A<</row>>
<<row>>14|5/24/2016 12:00:00 AM|14.369|14.369|14.369||-0.567434779600033|-0.0820000000000007|14.451|5/23/2016 12:00:00 AM|A<</row>>
<<row>>15|5/24/2016 12:00:00 AM|33.37|33.37|33.37||-0.566150178784281|-0.190000000000005|33.56|5/23/2016 12:00:00 AM|A<</row>>
<<row>>22|5/24/2016 12:00:00 AM|15.87|15.87|15.87||-0.501567398119123|-0.0800000000000001|15.95|5/23/2016 12:00:00 AM|A<</row>>
<<row>>23|5/24/2016 12:00:00 AM|64.37|64.37|64.37||-0.540791100123601|-0.349999999999994|64.72|5/23/2016 12:00:00 AM|A<</row>>
<<row>>115|5/24/2016 12:00:00 AM|10.1146|10.1146|10.1146||-0.00197730058924853|-0.00020000000000131|10.1148|5/23/2016 12:00:00 AM|A<</row>>
<<row>>116|5/24/2016 12:00:00 AM|25.8745|25.8745|25.8745||-0.00193236714975395|-0.000499999999998835|25.875|5/23/2016 12:00:00 AM|A<</row>>
<<row>>117|5/24/2016 12:00:00 AM|10.3195|10.3195|10.3195||-0.00193804083451587|-0.000199999999999534|10.3197|5/23/2016 12:00:00 AM|A<</row>>
<<row>>118|5/24/2016 12:00:00 AM|10.317|10.317|10.317||-0.0019385104485668|-0.000199999999999534|10.3172|5/23/2016 12:00:00 AM|A<</row>>
<<row>>119|5/24/2016 12:00:00 AM|10.0863|10.0863|10.0863||-0.00198284836166692|-0.000199999999999534|10.0865|5/23/2016 12:00:00 AM|A<</row>>
<<row>>160|5/24/2016 12:00:00 AM|10.0729|10.0729|10.0729||0.0148936592727928|0.00150000000000006|10.0714|5/23/2016 12:00:00 AM|A<</row>>
<<row>>165|5/24/2016 12:00:00 AM|17.3863|17.3863|17.3863||0.0155318806231003|0.00269999999999726|17.3836|5/23/2016 12:00:00 AM|A<</row>>
<<row>>166|5/24/2016 12:00:00 AM|10.0315|10.0315|10.0315||0|0|10.0315|5/23/2016 12:00:00 AM|A<</row>> 

我能够解析文件并删除row等不需要的数据,并使用|拆分数据。

我面临的问题是如何将数据映射到列名称,因为样本数据文件没有列名和数据。

我的一个解决方案是在文件顶部添加一个虚拟列名称行,通过它我可以映射数据。

但我不确定这是否是正确的方法。

如何解决此问题的任何帮助或建议都会有所帮助。

谢谢!

注意:如果您需要查看我所提供的代码,我将很乐意提供。

2 个答案:

答案 0 :(得分:1)

您可以从表定义中了解它们的顺序,因此您可以通过索引号引用该列。如果行存储在变量row中,则id字段将为row[0]

当然这不容易阅读,为了更好的阅读,你可以使用常数:

ID = 0
.....
this_rows_id = row[ID]

如果您不喜欢列号和常量名之间的映射的手动定义,但是可以访问模式定义,则可以解析它并生成一个小的Ruby文件然后 {{1} 进入你的程序。这在项目的初始阶段可能很方便,其中模式定义可能会发生变化。

答案 1 :(得分:1)

  1. 您可以定义数组

  2. 为每一行推送其中的所有拆分值。

  3. 现在根据您的架构的数组索引值进行映射。