
3.6 路径和字符串
路径(Path)和字符串(String)在本质上极为类似,路径可以理解为特殊形式的字符串。这使得设计人员在设计时可以根据情况将要处理的路径先转换为字符串,使用字符串处理函数进行处理,随后再将返回的字符串转换为路径即可。图3-18显示了LabVIEW中字符串和路径操作的函数集。

图3-18 LabVIEW字符串和路径操作函数集
路径控件用于输入或返回磁盘文件或文件夹的路径。从本质上看,路径控件是特殊形式的字符串,但是它根据程序所运行的平台和文件系统的描述形式,来格式化文件或文件夹的路径字符串。LabVIEW中的路径有“相对路径”(Relative Path)和“绝对路径”(Absolute Path)之分。绝对路径描述文件或文件夹相对于文件系统根路径的位置,相对路径则描述文件或文件夹相对于文件系统中另一文件或文件夹的相对位置。通常在程序中使用相对路径避免程序在另一台计算机上运行时对路径的修改。例如,程序有一个配置文件main.ini存放在一个和主VI在同一目录下的config文件夹中,就可以用LabVIEW的“获取当前VI路径”函数配合“路径组合”(Build Path)函数在主VI中返回配置文件的路径(图3-19),这种方法在设计中广为使用。

图3-19 主VI中返回配置文件main.ini的路径
由于路径是特殊的字符串,因此也可以在将路径转换为字符串后,使用LabVIEW的字符串处理函数对其进行处理。LabVIEW提供几乎可以处理任何问题的字符串函数,这些函数可汇总为表3-4中所列的几方面。
表3-4 LabVIEW中的字符串处理函数功能

LabVIEW中的字符串有四种显示方式,这些显示方式可以通过组件的右键菜单中的“显示类型”(Display Type)或“属性”(Property)选项来选择。LabVIEW可选择的选项如表3-5所示。
表3-5 字符串的显示类型

图3-20给出了字符串编辑解析的简单示例。在例子中首先使用字符串组合函数将三个字符串String1、String2和String3组合为字符串String1String2String3。字符串组合函数可以将多个不同长度的字符串常量或变量连接在一起形成一个字符串。其次,使用获取字符串子集函数(String Subset)获得从第3个字符开始(注意第一个字符索引为0),长度为8的子字符串ring1Str。字符串子集函数获取从指定起始点开始指定长度的字符串。接着,使用“字符串替换”(Replace SubString)函数以abc替换从第2个字符开始的连续三个字符,得到rabc1Str。字符串替换函数从指定起始点开始用指定长度的子字符串字符替换字符串中的字符,它不仅返回替换后的结果,还返回被替换的字符。最后,将替换函数返回的结果rabc1Str进行反转,得到rtS1cbar,将被替换的字符ing转换为全部大写ING后进行一次旋转输出NGI。字符串旋转函数会将字符串第一个字符移动到最后一个字符位置,同时将所有其他字符向前移动一位。

图3-20 字符串的编辑示例
在上面例子中提到了字符串的替换。子字符串在源字符串中的位置可以通过起始位置和长度来定位,例如获取字符串子集函数和字符串替换函数等。除了通过子字符串定位的方式来获取子字符串外,还可以通过关键字(Key Word)或正则表达式(Regular Expressions)来查找字符串。例如可以在“I love dog.”中查找“dog”,或使用“be?t”查找“bt”和“bet”。“查找并替换字符串”(Search and Replace String)函数一般通过关键字进行查找,如果要进行复杂查找替换操作,它也可以像匹配模式函数和按模式查找替换函数一样使用兼Perl语言的标准正则表达式来实现(“查找并替换字符串函数”的右键菜单中选择“Regular Expression”选项进行配置)。“按模式查找”(Match Pattern )函数
、“按模式查找替换”(Search and Replace Pattern)函数
和“匹配正则表达式”(Match Regular Expression function)函数
均通过正则表达式实现字符串的查找替换;拖长匹配正则表达式函数尺寸可以看到更多返回选项,但相对于按模式查找函数来说其执行速度较慢。
正则表达式中常用的特殊字符含义见表3-6。
表3-6 正则表达式中常用的特殊字符

字符串的删除操作可以看作是替换函数的特例。将用于替换的字符串设置为空字符就可实现字符串的删除操作。如果在前面的例子基础上对反转后字符串用正则表达式[0-9]进行匹配,代码和运行结果如图3-21所示。

图3-21 使用正则表达式示例
在程序设计过程中,一方面经常要将数值格式化到字符串中显示给用户或保存到磁盘;另一方面需要将数字从字符串中(如通过网络获取的报文几乎均为字符串)提取出来参与运算,这时需要通过LabVIEW的各种字符串格式化函数来进行处理。字符串格式化函数使用“格式化说明符”(Format Specifier)以%符号引导,来告诉LabVIEW如何进行字符转换,例如%x表示将十六进制数转换为字符串。
“格式化至字符串”(Format Into String)函数可将多个数值、枚举、时间戳、布尔甚至路径字符串类型的输入按照格式化说明符的要求格式化为文本。与之相反,“从字符串中扫描”(Scan From String)函数
可以从字符串中按照格式化说明符扫描需要的值。以数值为例,如果希望将数字0.345保留2位小数、1.17保留1位小数、2.756保留三位小数,并组合成公式“Result=0.34+1.2-2.756”显示给客户,则可以在“格式化至字符串函数”中使用格式化说明符“%.2f”“%.1f”和“%.3f”将数字转换为字符串,并连接字符串“Result=”,和加减符号形成正确的字符串显示给用户。多数情况下,使用以%作为引导的格式化说明符就能满足要求,但是这并不意味着只能使用这些特殊字符。为了方便实现,可以在格式化说明符中混合常规字符和特殊字符,如图3-22(a)所示。图3-22(b)是从字符串中提取数值的例子。

图3-22 字符串与数值转换
“数组到电子表格的转换”(Array To Spreadsheet String)函数和“电子表格到数组的转换”(Spreadsheet String To Array)函数仅使用一个格式化说明符,即可在任意维数的数组和元素为字符串的电子表格之间转换。电子表格使用Tab分隔电子表格的每一列元素,使用平台独立的行结束符(EOL)分隔每一行。对于三维以上数组,使用数组索引来分页。图3-23是一个三维数组到电子表格的转换示例。
字符串也可以被看作是被数组封装在一起的一组连续ASCII字符,如有必要,也可以在程序中将字符串转换为数组后进行处理。

图3-23 三维数组到电子表格的转换示例