在ruby中创建文件描述符

时间:2014-09-03 15:46:20

标签: ruby text-parsing

我正在编写一个脚本,将使用DSV或位置文件执行各种任务。这些任务各不相同,就像为文件创建数据库表或创建用于解析它的shell脚本一样。

因为我理想化了我的脚本会收到一个"描述符"作为执行其任务的输入。然后它将解析此描述符并相应地执行其任务。

我提出了一些关于如何指定描述符文件的想法,但没有真正设法得到一些强大的东西 - 可能是因为我缺乏ruby经验。

看起来,解析描述符的最好方法是使用ruby语言本身,然后以某种方式捕获解析异常以变成与上下文更相关的东西。

示例:

我将阅读的文件看起来像(myfile.dsv):

jhon,12343535,27/04/1984
dave,53245265,30/03/1977
...

描述符文件myfile.des包含:

FILE_TYPE = "DSV"
DSV_SEPARATOR = ","

FIELDS = [
    name => [:pos => 0, :type => "string"],
    phone => [:pos => 1, :type => "number"],
    birthdate => [:pos => 2, :type => "date", :mask = "dd/mm/yyyy"]
]

用法应该是:

ruby script.rb myfile.des --task GenerateTable

所以程序script.rb应该加载并解析描述符myfile.des并相应地执行任何任务。

有关如何执行此操作的任何想法?

1 个答案:

答案 0 :(得分:2)

使用YAML

不要自己滚动,而是使用标准库中的YAML

示例YAML文件

将文件命名为 descriptor.yml ,并填写:

---
:file_type: DSV
:dsv_separator: ","
:fields:
  :name:
    :pos: 0
    :type: string
  :phone:
    :pos: 1
    :type: number
  :birthdate:
    :pos: 2
    :type: date
    :mask: dd/mm/yyyy

加载YAML

您可以通过以下方式阅读配置:

require 'yaml'
settings = YAML.load_file 'descriptor.yml'

这将返回设置 Hash,如:

{:file_type=>"DSV",
 :dsv_separator=>",",
 :fields=>
  {:name=>{:pos=>0, :type=>"string"},
   :phone=>{:pos=>1, :type=>"number"},
   :birthdate=>{:pos=>2, :type=>"date", :mask=>"dd/mm/yyyy"}}}

然后您可以根据需要访问以配置您的应用程序。