IDL中可以用单引号‘’或双引号""来创建字符转
>>a = 'hlz'
>>b = "hlz"
>>a eq b
1
创建字符串数组,可以利用中括号[]和逗号,相组合的方式进行创建
>>a = ['Hlz','XMU','厦门']
>>a
Hlz
XMU
厦门
>>help,a
A STRING = Array[3]
>>a[1] ; 字符串数组是可以被索引,只能索引整个元素,无法索引某个元素组成
XMU
注:字符串是无法索引的,字符串数组可以,可以用字符串提取(截取)函数Strmid()实现,这个往往会用到字符转长度查看函数Strlen()、子字符串搜索函数Strpos()、去除字符串首尾空格函数Strtrim()。
语法:Result = STRMID(Expression, First_Character [, Length] , /REVERSE_OFFSET )
语法:Result = STRLEN(Expression)
语法:Result = STRPOS( Expression, Search_String [, Pos], /REVERSE_OFFSET, /REVERSE_SEARCH )
语法:Result = STRTRIM( String [, Flag] )
>>a = 'hlz-xiamenuniversuty'
>>a[2]
% Attempt to subscript A with is out of range.
% Execution halted at: $MAIN$
>>a = 'hlz-xiamenuniversuty' ; 包含前后空格的字符串a
>>print,Strlen(a) ; 查看字符串a的长度
22
>>a = Strtrim(a,2) ; 移除两端空格,0:移除右端所有空格;1:移除左端所有空格;2:移除左右两端所有空格
>>print,Strlen(a)
20
>>; 提取字符串中xiamen子字符串
>>index1 = Strpos(a,'xiamen') ; 字符串'xiamen'在字符串a的的位置,返回子字符串的起始位置,若不存在则返回-1
>>index1
4
>>leng_str = Strlen('xiamen') ; 字符串'xiamen'的长度
>>leng_str
6
>>b = Strmid(a,index1,leng_str) ; 提取字符串a中的子字符串
>>b
xiamen
创建空字符串,可以利用StrArr()函数,进行创建;
语法:Result = STRARR(D1[, ..., D8])
>>S = STRARR(4,3) ; 创建4列3行的空的字符串数组
>>help,S
S STRING = Array[4, 3]
>>S[1,1] ; 查看元素值
>>help,S[1,1] ; 查看元素值
STRING = ''
IDL中无法用length对象方法查看字符串的长度,可以利用字符转长度查看函数Strlen()查看
>>a = 'hlz-xiamenuniversuty'
>>a.LENGTH
1
>>a.DIM
0
>>print,Strlen(a)
20
当用函数Strlen()查看字符串数组时,会实现每个字符串元素的长度。
>>Files
e:\Test\1.tff
e:\Test\2.jpg
>>print,Strlen(files)
13 13
>>help,Strlen(files)
LONG = Array[2]
此外,字符串数组中元素的个数可以用length方法、函数N_elements()获取。
>>Files
e:\Test\1.tff
e:\Test\2.jpg
>>print,files.LENGTH
2
>>print,N_elements(files)
2
IDL中字符串连接和python一样,可以直接相加
>>a = 'hlz'
>>b = 'xmu'
>>c = a+'\'+b+'.jpg'
>>c
hlz\xmu.jpg
字符串数组元素之间相连接,可以使用jion方法进行连接
>>a = ['Hlz','jiangxiprovince','jingdezhenCity']
>>b = a.Join('\') ; 将a中所有元素用\相连接
>>b
Hlz\jiangxiprovince\jingdezhenCity
注:当将字符串连接起来,组成一个文件路径是,最好用Path_sep()函数,该函数可以获取当前系统的分隔符,linux和win不同,分隔符是不一样的;win的分隔符为‘\’;linux的分隔符为‘/’。
字符串大小写转化函数
Strlowcase():将大写字符转化为小写字符
Strupcase():将小写字符转化为大写字符
语法:Result = STRLOWCASE(String)
语法:Result = STRUPCASE(String)
>>a = 'Hulz_Jiangxi_OK'
>>print,Strlowcase(a)
hulz_jiangxi_ok
>>print,Strupcase(a)
HULZ_JIANGXI_OK
首字母大写:那么问题来了,如何将首字母转化为大写,其余字母小写。
首先,将字母转化为小写,提取除首字母以外的字符,提取第一个字母并转化为大写,最后合并。用到了Strlowcase()、Strupcase()、Strmid()函数。
>>a = 'Hulz_Jiangxi_OK'
>>print,Strlowcase(a) ; 第一步:转化为小写
hulz_jiangxi_ok
>>print,Strmid(Strlowcase(a),1); 第二步:提取字符串(小写部分)
ulz_jiangxi_ok
>>print,Strupcase(Strmid(Strlowcase(a),0,1)); 第二步:提取字符串(大写部分)
H
>>print,Strupcase(Strmid(Strlowcase(a),0,1))+Strmid(Strlowcase(a),1);第三步:合并
Hulz_jiangxi_ok
此外,字符串可以直接转化为字节型Byte数据,即将字母转化为对应的数字,反之亦然。
>>a = 'hlz'
>>b = Byte(a)
>>b
104 108 122
>>help,b
B BYTE = Array[3]
>>c = long(a)
% Type conversion error: Unable to convert
given STRING to Long.
% Detected at: $MAIN$
>>d = long(Byte(a))
>>d
104 108 122
可以用函数Strmid()实现,具体介绍见本博客第1节
可以用File_basename()函数,根据字符串获取文件名
语法:Result = File_basename(Path [, RemoveSuffix] [, /FOLD_CASE])
>>fn = File_basename('e:\Test\sentinel1.tiff')
>>fn
sentinel1.tiff
可以用File_dirname()函数,根据字符串获取文件路径
语法:Result = FILE_DIRNAME(Path [, /MARK_DIRECTORY])
>>dn = File_dirname('e:\Test\sentinel1.tiff')
>>dn
e:\Test
可以用Routine_filepath()函数,根据编译的文件名,获取该文件的完整路径(字符串)。
注:需先编译文件,才能使用。
语法:Result = ROUTINE_FILEPATH( [Routine] [, /EITHER] [, /IS_FUNCTION] )
返回的是一个包含两个元素的结构体,Result .Name表示文件名,Result.path表示文件路径。
>> .compile -v 'D:\Code\IDL\IDL_GUI\源码\chapter05\test_readF.pro'
% Compiled module: TEST_READF.
>> ROUTINE_FILEPATH('TEST_READF')
D:\Code\IDL\IDL_GUI\源码\chapter05\test_readF.pro
注:在可以利用File_dirname()函数和File_basename()函数,获取文件路径和文件名。
字符串比较函数Strcmp(),可以比较两个字符串时候一样,
语法:Result = STRCMP( String1, String2 [, N], /FOLD_CASE )
参数N表示只比较前N个字符,关键字FOLD_CASE表示区分大小写
>>a = 'Hlz'
>>b ='hlz'
>>c = 'Hlz-fox'
>>print,Strcmp(a,b,/Fold_case) ; 是否区分大小写,默认不区分
1
>>print,Strcmp(a,b,Fold_case=0) ; 区分大小写
0
>>print,Strcmp(a,c) ; 不加参数N
0
>>print,Strcmp(a,c,2) ; 只比较前2个字符
1
以下是字符串处理历程(来源:官方文档)
FILE_BASENAME - 返回文件路径的基本名称。
FILE_DIRNAME - 返回文件路径的目录名。
I18N_MULTIBYTETOUTF8 - 将多字节转换为 UTF8。
I18N_MULTIBYTETOWIDECHAR - 将多字节转换为 UTF-16、宽字符 (Unicode)。
I18N_UTF8TOMULTIBYTE - 将 UTF-8 转换为多字节。
I18N_WIDECHARTOMULTIBYTE - 将 UTF-16、宽字符 (Unicode) 转换为多字节。
IDL_BASE64 - 在字节数组和 MIME Base64 编码的标量字符串之间转换。
READS - 从字符串变量执行格式化的输入/输出。
STRCMP - 比较两个字符串。
STRCOMPRESS - 从字符串中删除空格。
STREGEX - 执行正则表达式匹配。
STRING - 将参数转换为字符串类型。
STRJOIN - 将字符串标量或数组折叠成合并的字符串。
STRLEN - 返回字符串的长度。
STRLOWCASE - 将字符串转换为小写。
STRMATCH - 将搜索字符串与输入字符串表达式进行比较。
STRMID - 从字符串中提取子字符串。
STRPOS - 在字符串中查找第一次出现的子字符串。
STRPUT - 将一个字符串的内容插入另一个字符串。
STRSPLIT - 根据指定的模式将其输入字符串参数拆分为单独的子字符串。
STRTRIM - 从字符串中删除前导和/或尾随空格。
STRUPCASE - 将字符串转换为大写。
字符串中包含引号,则最后用另一种引号创建。
例如:打印:I'm Hlz, 打印:你真"棒"!
>>print,"I'm Hlz"
I'm Hlz
>>print,'I'm Hlz'
print,'I'm Hlz'
^
% Syntax error.
你真"棒"!
>>print,"你真"棒"! "
print,"你真"棒"! "
^
% Syntax error.
print,"你真"棒"! "
^
% Illegal character in program text.
如果字符串中既有单引号、又有双引号的字符串该如何处理?可以分开输入,在合并!
>>print,"I'm Hlz"+'你真"棒"!'
I'm Hlz你真"棒"!
略……(下次补充)
注:后续将针对字符串,整理相关的函数
不足之处,敬请斧正!
路漫漫其修远兮,吾将上下而求索