使用Ruby来处理文本的教程

与 Perl 和 Python 类似,Ruby 拥有出色的功能,是一种强大的文本处理语言。本文简单介绍了 Ruby 的文本数据处理功能,以及如何使用 Ruby 语言有效处理不同格式的文本数据,无论是 CSV 数据还是 XML 数据。
Ruby 字符串
常用缩略词

  • CSV:逗号分隔值
  • REXML:Ruby Electric XML
  • XML:可扩展标记语言

Ruby 中的 String 是容纳、比较和操作文本数据的一种强大方法。在 Ruby 中,String 是一个类,可以通过调用 String::new 或向它分配一个字面值将它实例化。

向 Strings 赋值时,可以使用单引号(')或双引号(")来包围值。单引号和双引号在为 Strings 赋值时有几个差别。双引号支持转义序列使用一个前置反斜杠(\)并支持在字符串中使用 #{} 操作符计算表达式。而单引号引用的字符串则是简单直接的文字。

清单 1 是一个示例。
清单 1. 处理 Ruby 字符串:定义字符串

message = 'Heal the World…'

puts message

message1 = "Take home Rs #{100*3/2} "

puts message1

Output :

# ./string1.rb

# Heal the World…

# Take home Rs 150

这里,第一个字符串使用一对单引号定义,第二个字符串使用一对双引号定义。在第二个字符串中,#{} 中的表达式在显示前计算。

另一种有用的字符串定义方法通常用于多行字符串定义。

从现在开始,我将使用交互式 Ruby 控制台 irb>> 进行说明。您的 Ruby 安装也应该安装该控制台。如果没有安装,建议您获取 irb Ruby gem 并安装它。Ruby 控制台是学习 Ruby 及其模块的一个非常有用的工具。安装之后,可以使用 irb>> 命令运行它。
清单 2. 处理 Ruby 字符串:定义多个字符串

irb>> str = >>EOF

irb>> "hello world

irb>> "how do you feel?

irb>> "how r u ?

irb>> EOF

"hello, world\nhow do you feel?\nhow r u?\n"

irb>> puts str

hello, world
how do you feel?
how r u?

在 清单 2 中,>>EOF 和 EOF 中的所有内容都视为字符串的一部分,包括 \n(换行)字符。

Ruby String 类有一组强大的方法用于操作和处理存储在它们之中的数据。清单 3、4 和 5 中的示例展示了部分方法。
清单 3. 处理 Ruby 字符串:连接字符串

irb>> str = "The world for a horse" # String initialized with a value

The world for a horse

irb>> str*2      # Multiplying with an integer returns a
           # new string containing that many times
           # of the old string.

The world for a horseThe world for a horse

irb>> str + " Who said it ? "  # Concatenation of strings using the '+' operator

The world for a horse Who said it ?

irb>> str<<" is it? " # Concatenation using the '<<' operator

The world for a horse is it?

提取子字符串并操作字符串的多个部分
清单 4. 处理 Ruby 字符串:提取并操作

irb>> str[0] # The '[]' operator can be used to extract substrings, just
      # like accessing entries in an array.
      # The index starts from 0.
84 # A single index returns the ascii value
      # of the character at that position

irb>> str[0,5] # a range can be specified as a pair. The first is the starting
      # index , second is the length of the substring from the
      # starting index.

The w

irb>> str[16,5]="Ferrari" # The same '[]' operator can be used
         # to replace substrings in a string
         # by using the assignment like '[]='
irb>>str

The world for a Ferrari

Irb>> str[10..22] # The range can also be specified using [x1..x2] 

for a Ferrari

irb>> str[" Ferrari"]=" horse" # A substring can be specified to be replaced by a new
        # string. Ruby strings are intelligent enough to adjust the
        # size of the string to make up for the replacement string.

irb>> s

The world for a horse

irb>> s.split  # Split, splits the string based on the given delimiter
        # default is a whitespace, returning an array of strings.

["The", "world", "for", "a", "horse"]

irb>> s.each(' ') { |str| p str.chomp(' ') }

        # each , is a way of block processing the
   # string splitting it on a record separator
   # Here, I use chomp() to cut off the trailing space

"The"
"world"
"for"
"a"
"horse"

Ruby String 类还可以使用许多其他实用方法,这些方法可以更改大小写、获取字符串长度、删除记录分隔符、扫描字符串、加密、解密等。另一个有用的方法是 freeze,该方法可以使字符串变得不可修改。对 String str 调用该方法(str.freeze)之后,str 将不能被修改。

Ruby 还有一些称为 “析构器(destructor)” 的方法。以感叹号(!)结尾的方法将永久修改字符串。常规方法(结尾没有感叹号)修改并返回调用它们的字符串的副本。而带有感叹号的方法直接修改调用它们的字符串。
清单 5. 处理 Ruby 字符串:永久修改字符串

irb>> str = "hello, world"

hello, world

irb>> str.upcase

HELLO, WORLD

irb>>str   # str, remains as is.

Hello, world

irb>> str.upcase!  # here, str gets modified by the '!' at the end of
        # upcase.
HELLO, WORLD

irb>> str

HELLO, WORLD

在 清单 5 中,str 中的字符串由 upcase! 方法修改,但 upcase 方法只返回大小写修改后的字符串副本。这些 ! 方法有时很有用。

Ruby Strings 的功能非常强大。数据被捕获进 Strings 中后,您就能够任意使用多种方法轻松有效地处理这些数据。

处理 CSV 文件

CSV 文件是表示表格式的数据的一种很常见的方法,表格式通常用作从电子表格导出的数据(比如带有详细信息的联系人列表)的格式。

Ruby 有一个强大的库,可以用于处理这些文件。csv 是负责处理 CSV 文件的 Ruby 模块,它拥有创建、读取和解析 CSV 文件的方法。

清单 6 展示了如何创建一个 CSV 文件并使用 Ruby csv 模块来解析文件。
清单 6. 处理 CSV 文件:创建并解析一个 CSV 文件

require 'csv'

writer = CSV.open('mycsvfile.csv','w')

begin

 print "Enter Contact Name: "

 name = STDIN.gets.chomp

 print "Enter Contact No: "

 num = STDIN.gets.chomp

 s = name+" "+num

 row1 = s.split

 writer << row1

 print "Do you want to add more ? (y/n): "

 ans = STDIN.gets.chomp

end while ans != "n"

writer.close

file = File.new('mycsvfile.csv')

lines = file.readlines

parsed = CSV.parse(lines.to_s)

p parsed

puts ""

puts "Details of Contacts stored are as follows..."

puts ""

puts "-------------------------------"

puts "Contact Name | Contact No"

puts "-------------------------------"

puts ""

CSV.open('mycsvfile.csv','r') do |row|

 puts row[0] + " | " + row[1] 

 puts ""
end

清单 7 显示了输出:
清单 7. 处理 CSV 文件:创建并解析一个 CSV 文件输出

Enter Contact Name: Santhosh

Enter Contact No: 989898

Do you want to add more ? (y/n): y

Enter Contact Name: Sandy

Enter Contact No: 98988

Do you want to add more ? (y/n): n

Details of Contacts stored are as follows...

---------------------------------
Contact Name | Contact No
---------------------------------

Santhosh | 989898

Sandy | 98988

让我们快速检查一下这个示例。

首先,包含 csv 模块(require 'csv')。

要创建一个新的 CSV 文件 mycsvfile.csv,使用 CSV.open() 调用打开它。这返回一个写入器(writer)对象。

这个示例创建了一个 CSV 文件,该文件包含一个简单的联系人列表,存储联系人姓名及其电话号码。在循环中,用户被要求输入联系人姓名和电话号码。姓名和电话号码被连接为一个字符串,然后分割为含两个字符串的数组。这个数组传递到写入器对象以便写入 CSV 文件。这样,一对 CSV 值就存储为文件中的一行。

循环结束后,任务也就完成了。现在关闭写入器,文件中的数据得以保存。

下一步是解析创建的 CSV 文件。

打开和解析该文件的一种方法是使用新的 CSV 文件名称创建一个新的 File 对象。

调用 readlines 方法将文件中的所有行读入一个名为 lines 的数组。

通过调用 lines.to_s 将 lines 数组转换为一个 String 对象,然后将这个 String 对象传递到 CSV.parse 方法,该方法解析 CSV 数据并将其内容返回为一个包含数组的数组。

下面介绍打开和解析该文件的另一种方法。以读取模式使用 CSV.open 调用再次打开文件。这返回一个行数组。使用某种格式打印每个行以显示联系人细节。这里的每个行对应文件中的行。

如您所见,Ruby 提供一个强大的模块来处理 CSV 文件和数据。

处理 XML 文件

对于 XML 文件,Ruby 提供一个名为 REXML 的强大的内置库。这个库可以用于读取和解析 XML 文档。

查看以下 XML 文件并试图用 Ruby 和 REXML 来解析它。

下面是一个简单的 XML 文件,列示一个在线购物中心的典型购物车中的内容。它拥有以下元素:

  • cart —— 根元素
  • user —— 购货用户
  • item —— 用户添加到购物车中的商品项
  • id, price 和 quantity —— 项目的子元素

清单 8 展示了这个 XML 的结构:
清单 8. 处理 XML 文件:示例 XML 文件

<cart id="userid">

<item code="item-id">

 <price>

 <price/unit>

 </price>

 <qty>

 <number-of-units>

 </qty>

</item>

</cart>

从 下载 部分获取这个示例 XML 文件。现在,加载这个 XML 文件并使用 REXML 解析文件树。
清单 9. 处理 XML 文件:解析 XML 文件

require 'rexml/document'

include REXML

file = File.new('shoppingcart.xml')

doc = Document.new(file)

root = doc.root

puts ""

puts "Hello, #{root.attributes['id']}, Find below the bill generated for your purchase..."

puts ""

sumtotal = 0

puts "-----------------------------------------------------------------------"

puts "Item\t\tQuantity\t\tPrice/unit\t\tTotal"

puts "-----------------------------------------------------------------------"

root.each_element('//item') { |item| 

code = item.attributes['code']

qty = item.elements["qty"].text.split(' ')

price = item.elements["price"].text.split(' ')

total = item.elements["price"].text.to_i * item.elements["qty"].text.to_i

puts "#[code]\t\t #{qty}\t\t   #{price}\t\t   #{total}"

puts ""

sumtotal += total

}

puts "-----------------------------------------------------------------------"

puts "\t\t\t\t\t\t  Sum total : " + sumtotal.to_s

puts "-----------------------------------------------------------------------"

清单 10 显示输出。
清单 10. 处理 XML 文件:解析 XML 文件输出

Hello, santhosh, Find below the bill generated for your purchase...

-------------------------------------------------------------------------
Item   Quantity    Price/unit    Total
-------------------------------------------------------------------------
CS001    2       100      200

CS002    5       200      1000

CS003    3       500      1500

CS004    5       150      750

-------------------------------------------------------------------------
               Sum total : 3450
--------------------------------------------------------------------------

清单 9 解析这个购物车 XML 文件并生成一个账单,该账单显示项目合计和采购总计(见 清单 10)。

下面我们具体介绍操作过程。

首先,包含 Ruby 的 REXML 模块,该模块拥有解析 XML 文件的方法。

打开 shoppingcart.xml 文件并从该文件创建一个 Document 对象,该对象包含解析后的 XML 文件。

将文档的根分配给元素对象 root。这将指向 XML 文件中的 cart 标记。

每个元素对象拥有一个属性对象,该属性对象是元素属性的 hash 表,其中属性名称作为键名,属性值作为键值。这里,root.attributes['id'] 将提供 root 元素的 id 属性的值(本例中为 userid)。

下面,将 sumtotals 初始化为 0 并打印标头。

每个元素对象还有一个对象 elements,该对象拥有 each 和 [] 方法,以便访问子元素。这个对象遍历所有带有 item 名称(通过 XPath 表达式 //item 指定)的 root 元素的子元素。每个元素还有一个属性 text,该属性容纳元素的文本值。

下一步,获取 item 元素的 code 属性以及 price 和 qty 元素的文本值,然后计算项目合计(Total)。将详细信息打印到账单并将项目合计添加到采购总计(Sum total)。

最后,打印采购总计。

这个示例展示了使用 REXML 和 Ruby 解析 XML 文件有多么简单!同样,在运行中生成 XML 文件,添加和删除元素及它们的属性也很简单。
清单 11. 处理 XML 文件:生成 XML 文件

doc = Document.new

doc.add_element("cart1", {"id" => "user2"})

cart = doc.root.elements[1]

item = Element.new("item")

item.add_element("price")

item.elements["price"].text = "100"

item.add_element("qty")

item.elements["qty"].text = "4"

cart .elements << item

清单 11 中的代码通过创建一个 cart 元素、一个 item 元素和它的子元素来创建 XML 结构,然后使用值填充这些子元素并将它们添加到 Document 根。

类似地,要删除元素和属性,使用 Elements 对象的 delete_element 和 delete_attribute 方法。

以上示例中的方法称为树解析(tree parsing)。另一种 XML 文档解析方法称为流解析(stream parsing)。“流解析” 比 “树解析” 更快,可以用于要求快速解析的情况。“流解析” 是基于事件的,它使用监听器。当解析流遇到一个标记时,它将调用监听器并执行处理。

清单 12 展示了一个示例:
清单 12. 处理 XML 文件:流解析

require 'rexml/document'

require 'rexml/streamlistener'

include REXML

class Listener

 include StreamListener

 def tag_start(name, attributes)

 puts "Start #{name}"

 end

 def tag_end(name)

 puts "End #{name}"

 end

end

listener = Listener.new

parser = Parsers::StreamParser.new(File.new("shoppingcart.xml"), listener)

parser.parse

清单 13 显示输出:
清单 13. 处理 XML 文件:流解析输出

Start cart

Start item

Start price

End price

Start qty

End qty

End item

Start item

Start price

End price

Start qty

End qty

End item

Start item

Start price

End price

Start qty

End qty

End item

Start item

Start price

End price

Start qty

End qty

End item

End cart

这样,REXML 和 Ruby 联合起来为您提供一种非常有效和直观地处理和操作 XML 数据的强大方法。

结束语

Ruby 拥有一组很好的内置库和外部库,支持快速、强大和有效的文本处理。您可以利用该功能简化和改进可能遇到的各种文本数据处理工作。本文只是 Ruby 的文本处理功能的简要介绍,您可以进一步深入了解该功能。

毋庸置疑,Ruby 是您需要的一个强大工具。

(0)

相关推荐

  • Ruby中关于hash的基本使用方法

    哈希键 - 值对的集合,类似这样:"employee" => "salary".它类似于数组,除了索引是通过任意键的任何对象的类型,而不是一个整数索引. 顺序遍历一个哈希键或值要么可能看起来是任意的,一般不会在插入顺序.如果访问的键的哈希值不存在,该方法将返回nil. 创建哈希: 使用数组中,有各种各样的方法来创建哈希值.可以 new 类方法创建一个空的hash : months = Hash.new 还可以使用 new 创建哈希,这是一个默认值,否则只是 n

  • 使用Ruby编写脚本进行系统管理的教程

    简介 Ruby 是一种功能极其丰富的.免费的.简单的.可扩展的.可移植的.面向对象的脚本编程语言.最近,它在 Web 领域广受欢迎.这在一定程度上要归因于非常强大的 Web 应用程序开发框架 Rails,Rails 正是用 Ruby 编写的.Rails,也称 Ruby on Rails(ROR),顾名思义,它为快速.有效地开发 Web 应用程序提供一个非常强大的平台.它是高度可伸缩的,Web 上有很多站点就是用 Ruby on Rails 构建的. 除了与 Rails 一起用作 Web 应用程序

  • 利用RJB在Ruby on Rails中使用Java代码的教程

    开始之前 关于本教程 Ruby on Rails (Rails) 是用 Ruby 编写的一个 full-stack Web 应用程序框架,而 Ruby 是一种功能丰富的.免费的.可扩展的.可移植的.面向对象的脚本编制语言.Rails 在 Web 应用程序开发人员之间非常流行.通过它,可以快速有效地开发 Web 应用程序,并将其部署到任何 Web 容器中,例如 IBM? WebSphere? 或 Apache Tomcat. 在 Rails 和类似的 Web 应用程序开发框架出现之前,用于 Web

  • 使用Ruby来处理文本的教程

    与 Perl 和 Python 类似,Ruby 拥有出色的功能,是一种强大的文本处理语言.本文简单介绍了 Ruby 的文本数据处理功能,以及如何使用 Ruby 语言有效处理不同格式的文本数据,无论是 CSV 数据还是 XML 数据. Ruby 字符串 常用缩略词 CSV:逗号分隔值 REXML:Ruby Electric XML XML:可扩展标记语言 Ruby 中的 String 是容纳.比较和操作文本数据的一种强大方法.在 Ruby 中,String 是一个类,可以通过调用 String::

  • 在Python上基于Markov链生成伪随机文本的教程

    首先看一下来自Wolfram的定义 马尔可夫链是随机变量{X_t}的集合(t贯穿0,1,...),给定当前的状态,未来与过去条件独立. Wikipedia的定义更清楚一点儿 ...马尔可夫链是具有马尔可夫性质的随机过程...[这意味着]状态改变是概率性的,未来的状态仅仅依赖当前的状态. 马尔可夫链具有多种用途,现在让我看一下如何用它生产看起来像模像样的胡言乱语. 算法如下, 找一个作为语料库的文本,语料库用于选择接下来的转换. 从文本中两个连续的单词开始,最后的两个单词构成当前状态. 生成下一个

  • 简单的Ruby中的Socket编程教程

    Ruby提供了两个级别访问网络的服务,在底层你可以访问操作系统,它可以让你实现客户端和服务器为面向连接和无连接协议的基本套接字支持. Ruby 统一支持应用程的网络协议,如FTP.HTTP等. 不管是高层的还是底层的.ruby提供了一些基本类,让你可以使用TCP,UDP,SOCKS等很多协议交互,而不必拘泥在网络层.这些类也提供了辅助类,让你可以轻松的对服务器进行读写. 接下来就让我们来学习如何进行 Ruby Socket 编程 什么是 Sockets 应用层通过传输层进行数据通信时,TCP和U

  • 使用Ruby实现简单的事物驱动的web应用的教程

    简介 对 Web 应用程序来讲,自动化的集成测试是一个非常重要的部分, 然而由于这些测试用例太依赖具体的 Web 页面的实现细节,这就给编写和维护带来的很大的挑战. 通常来讲有两种方法可以生成 Web 应用程序测试用例. 手工编写脚本:测试人员需要知道 Web 页面上有哪些表单.输入框.选择框.按钮等,以及这些表单元素的名称,ID 等属性,然后才能利用一些工具来编写测试用例.     通过工具录制生成:比如 IBM Rational Functional Tester 就提供了录制用户在 Web

  • Ruby入门介绍第1/5页

    一.方法 Ruby 的方法定义允许为参数设置默认值,不过在带有默认值的参数后面不能出现不带有默认值的参数(允许 * 和 &),也就是说下面的方法定义是不被允许的,解释时会出现 parse error. 还有一点与 C# 不同的是,方法定义不能出现在方法调用的后面. # parse error def Display(args1="proshea", args2) end # 允许 def Display(args1="proshea", *args2) en

  • python实现百万答题自动百度搜索答案

    用python搭建百万答题.自动百度搜索答案. 使用平台 windows7 python3.6 MIX2手机 代码原理 手机屏幕内容同步到pc端 对问题截图 对截图文字分析 用浏览器自动搜索文本 使用教程 1.使用Airdroid 将手机屏幕显示在电脑屏幕上.也可使用360手机助手实现.不涉及任何代码.实现效果如图: 2.在提问出现时,运行python程序,将问题部分截图. 这里要用到两个函数: get_point()  #采集要截图的坐标,以及图片的高度宽度 window_capture() 

  • 在Ruby on Rails中使用AJAX的教程

    如果没有听说过 Rails,那么欢迎您外星旅行归来,近几年大概只有那个地方没有听说过 Ruby on Rails 了.Rails 最吸引人的地方是能够很快地建立功能完备的应用程序并运行起来.Rails 为 Ajax 而内置集成的 Prototype.js 库可以轻松快速地创建所谓的富 Internet 应用程序. 本文将逐步引导您创建 Rails 应用程序.然后深入分析如何利用 Ajax 特性编写从服务器上读写数据的 JavaScript 代码. 从容起步 Ajax 之旅--Ajax 技术资源中

  • CentOS 7下配置Ruby语言开发环境的方法教程

    本文跟大家分享的是在CentOS 7下配置Ruby语言开发环境的方法教程,分享出来供大家参考学习,下面来看看详细的介绍: 安装Ruby 2.2 CentOS7存储库中的Ruby版本为2.0,但如果需要,可以使用RPM软件包安装2.2 1.添加CentOS SCLo软件集合存储库 [root@linuxprobe ~]# yum -y install centos-release-scl-rh centos-release-scl # set [priority=10] [root@linuxpr

  • RUBY 新手教程 跟我一起学ruby

    跟我一起学ruby By Tiger 注:本教程转载自在游戏先行者论坛,版权属于作者Tiger. 第一篇 第二篇 第一篇 自序 从今天起我就要开始学Ruby了.怎么样,没见吧?一个新人写教程.就凭我坚强的毅力,科学的自学方法,以及我的钻研精神,我有信心学通Ruby,而同样是新手的你也可以!由于本教程是菜鸟教莱鸟若有什么不对的地方还请前辈指教!如果没人看,就当我自愚自乐了. ==============================================================

  • 在Ruby中利用Net::SMTP类发送电子邮件的教程

    简单邮件传输协议(SMTP)发送电子邮件及路由的e-mail邮件服务器之间的协议处理. Ruby 提供 Net::SMTP 类的简单邮件传输协议(SMTP)客户端的连接,并提供了两个新的方法:new 和 start. new 带两个参数: server name 默认为 localhost port number  默认为熟知的 25 start 方法带有以下这些参数: server - IP SMTP服务器名称,默认为localhost port - 端口号,默认为25 domain - 邮件

随机推荐