主题:  解析文本和列表

alalala

职务:普通成员
等级:1
金币:2.0
发贴:64
注册:2000/12/18 14:07:27
#12003/6/23 23:18:00
只是想为多媒体的发展尽一份力。以下是翻译director online 上的一篇关于解析文本和列表的文章,觉得简单有用,所以给大家共享。动机单纯。-------alalala


问题
我有一个名为“fonts”的域和如下的文本

["MezzMM_375 RG", "MezzMM", "Cottonwood", "Lithos Regular", "Minion Condensed", "Minion Ornaments", "Poetica ChanceryI", "Utopia", "Viva BoldExtraExtended", "Viva Regular", ..."SurethingSymbols", "Zephyr"]

(这是简化了的。原件有一百多名字)

我需要将其转换为按字母顺序排列的有序列表(不是程序列表),看上去应该是这样:

Arial
ArialBlack
ArialNarrow
BookAntiqua
BookmanOldStyle
BookshelfSymbol1
...
Wingdings
Woodcut
Xcast
ZapfElliptBT
Zephyr

这样看来,我需要删除引号,逗号和括弧,将逗号替换为换行。


回答
我之所以选择你的问题主要有两个原因。第一,再没有比理解如何处理文本这个概念更为有用的了。我几乎记不记来有多少次我使用这种技巧来处理类似这样的处理外部文本文件,核实用户输入等。

第二点,你的问题指出一个事实,好的开发者用lingo来帮助自己编辑。我们将要做的其实是一个编辑工具-------也许永远不会在程序运行中使用。这种类型的编辑器能节省你大量的时间。更重要的是它可以帮助你避免手动的输入数据题条目。

现在,我们来解释一下。我们需要做两件事。按字母顺序排列列表和处理不想要的字符。让我们从区别lingo 列表和字符串开始。在lingo中,字符串是包括在引号任何顺序的字节。同样的字符串能够出现在域中,然而域只能保留字符串,所以你并不需要用引号把字符串引起来。

你应该习惯看到扩在括弧里的列表。就象这样:
set mylist=[#cat,#dog,#bird]
put mylist
-------[#cat,#dog,#bird]

在这个列表里,我列出了三个symbol格式的条目(用#开头)。现在,我将把这个列表导入到一个域中(假定我有一个名为“animals”的域)

put mylist into field “animals”

现在,这个名为“animals”的域看上去会象这样

[#cat,#dog,#bird]

但是这会出现一个麻烦的情况:如果我试图把这域“animals”中的文字返回到头一个列表中。

Set mylist=the text of field “animals”
Put mylist
----“[#cat,#dog,#bird]”

有什么不同?注意这次显示的结果是字符串-----看见引号了吗?这意味着我们不能再将它视作列表了。我不再能对它进行任何常规列表的操作。然而,我们可以很容易的将它从字符串再转换回列表来。既然”animals”中的字符还是正确的列表语法规则(有括号和逗号),我这样做:

set mytext=the text of field “animals”
set mylist=value(mytext)
put mylist
----[#cat,#dog,#bird]

voila!(瞧!----作者使用了法语)通过使用value语句,我们把字符串转为了列表。

我花了这么大的精力来解释这两者的不同是因为我们要将数据同时作为字符串和列表处理。为什么呢?我们需要将它作为字符串以便进行字节的搜索,替换,删除等操作。另一方面我们需要它作为列表以便作sort()的操作。

我们开始编码,将输入域中的文字置入到变量“thesring”中。接下来,我们将字符串转换为叫“thelist”的列表。现在,它是列表了,我们可以用”sort thelsit”来排序了。现在列表顺序排好了,我们需要将它导回字符串,通过使用sring()的命令。

On parsefield whichfield

Set thestring=the text of field whichfield
Set thelist=value(thestring)
Sort thelist
Set thestring=string(thelist)
Set howmany=the number of chars in thestring

Repeat with I=howmany down to 1
Case char I of thestring of
“,”: put return into char I of thestring
return,quote,space,”[“,”]”: delete char I of thestring
end case
end repeat

put thestring into field whichfield
end

剩下的只是一个简单的从最后一个字符到第一个字符的处理。试一下是否括弧,空格,引号或是逗号都被转换了。注意我是运用了lingo语句return,quote,和space

当我们处理完整个子串,我们将它置回域中。

总是将文本置入变量,在变量中处理字符,再把变量置回域中。我不知为什么,但它引人注目的快。



滨滨

职务:版主
等级:4
金币:13.0
发贴:1931
注册:2000/11/4 21:26:33
#22003/6/23 23:54:18
有时间的时候,我会写一个字符串xtra,为director增加类似PHP/Perl的正则表达式功能.



漫游者

职务:普通成员
等级:1
金币:0.0
发贴:56
注册:2004/2/29 12:52:11
#32004/4/23 23:23:11
xtra不是插件吗?怎么是字符串?



hnxw820

职务:普通成员
等级:1
金币:0.0
发贴:7
注册:2004/9/18 11:00:20
#42004/9/21 10:39:19
前面的解释很诱人
可是后面就看不懂了