我的应用程序中有一个列表,我正在处理..它基本上是这样的:
public void processRecord(Record record)
{
if(record.getSid()==RowRecord.sid){
newrowrec = (RowRecord) record;
System.out.println("new ROW NUMBER : "+ newrowrec.getRowNumber());
System.out.println("new LAST ROW NUMBER : "+ newrowrec.getLastCol());
}
switch (record.getSid())
{
case BOFRecord.sid:
BOFRecord bof = (BOFRecord) record;
if (bof.getType() == bof.TYPE_WORKBOOK)
{
System.out.println("Encountered workbook");
// assigned to the class level member
} else if (bof.getType() == bof.TYPE_WORKSHEET)
{
System.out.println("Encountered sheet reference");
}
break;
case RowRecord.sid:
RowRecord rowrec = (RowRecord) record;
System.out.println("Row found, first column at "
+ rowrec.getFirstCol() + " last column at " + rowrec.getLastCol());
break;
case NumberRecord.sid:
NumberRecord numrec = (NumberRecord) record;
System.out.println("Cell found with value " + (long)numrec.getValue()
+ " at row " + numrec.getRow() + " and column " + numrec.getColumn());
rowlist.add(String.valueOf((long)(numrec.getValue())).toLowerCase());
if(numrec.getColumn()==newrowrec.getLastCol()-1){
System.out.println("NUMBER ROWLIST: "+ rowlist);
extractRow(rowlist, newrowrec.getRowNumber());
rowlist.clear();
}
break;
case BlankRecord.sid:
BlankRecord blankrec = (BlankRecord) record;
System.out.println("BLANK VALUE at row: "+ blankrec.getRow() + " at coloumn: " + blankrec.getColumn());
rowlist.add("null");
break;
case SSTRecord.sid:
sstrec = (SSTRecord) record;
for (int k = 0; k < sstrec.getNumUniqueStrings(); k++)
{
System.out.println("String table value " + k + " = " + sstrec.getString(k));
System.out.println("SSTRECORD ROWLIST: "+ rowlist);
}
break;
case LabelSSTRecord.sid:
lrec = (LabelSSTRecord) record;
rowlist.add(sstrec.getString(lrec.getSSTIndex()).toString());
break;
}
然后我拿起列表中的第一个成员:
$item = {text1 text2 text3}
在执行此操作时,曾经(例如)lindex $item 0
的text1变为abcdef\12345
。
但对我来说,不要失去这个abcdef12345
非常重要。为什么它会消失。这些其他字符如\
和-
都不会消失。请注意,我无法事先逃避文本中的>
。如果我在使用\
操作$item
之前有任何我可以做的事情,请建议。
答案 0 :(得分:1)
问题是\
是一个Tcl列表metasyntax字符,与-
,>
或任何字母数字不同。在使用lindex
(或任何其他列表消耗操作)之前,您需要将字符串转换为正确的Tcl列表。要做到这一点,您需要通过输入数据中的“单词”理解完全 你的含义。如果您的输入数据是由单个空白字符分隔的非空白字符序列,则可以使用split
进行转换为列表:
set properList [split $item]
# Now we can use it...
set theFirstWord [lindex $properList 0]
如果你有一个不同的分隔符,split
需要一个可选的额外字符来说明要分割的内容。 例如,要按冒号(:
)进行拆分:
set properList [split $item ":"]
但是,如果您有其他类型的拆分规则,则效果不佳。例如,如果您可以通过多个空白字符进行拆分,那么使用regexp
(使用-all -inline
选项)进行单词识别实际上更好:
# Strictly, this *chooses* all sequences of one or more non-whitespace characters
set properList [regexp -all -inline {\S+} $item]
您也可以通过多字符序列进行拆分,但在这种情况下,最容易通过将多字符序列映射(使用string map
)到单个罕见字符来完成。 Unicode意味着有 lot 这样的字符可供选择......
# NUL, \u0000, is a great character to pick for text, and terrible for binary data
# For binary data, choose something beyond \u00ff
set properList [split [string map {"BOUNDARY" "\u0000"} $item] "\u0000"]
可能会有更复杂的选项,但是当您使用Tcllib中的splitx
时就是这样。
package require textutil::split
# Regular expression to describe the separator; very sophisticated approach
set properList [textutil::split::splitx $item {SPL+I*T}]
答案 1 :(得分:0)
在tcl中,可以通过多种方式创建列表:
将变量设置为值列表
set lst {{item 1} {item 2} {item 3}}
使用split命令
set lst [split "item 1.item 2.item 3" "."]
使用list命令。
set lst [list "item 1" "item 2" "item 3"]
可以使用lindex命令访问单个列表成员。
set x "a b c"
puts "Item 2 of the list {$x} is: [lindex $x 2]\n"
这将给出输出:
Item 2 of the list {a b c} is: c
关于提出的问题
您需要像abcdef\\12345
为了明确这一点,请尝试运行以下命令。
puts "\nI gave $100.00 to my daughter."
和
puts "\nI gave \$100.00 to my daughter."
第二个会给你正确的结果。
如果您没有更改文本的选项,请尝试将文本保存为花括号,如第一个示例中所述。
set x {abcd\12345}
puts "A simple substitution: $x\n"
输出:
A simple substitution: abcd\12345
set y [set x {abcdef\12345}]
并检查此输出:
puts "Remember that set returns the new value of the variable: X: $x Y: $y\n"
输出:
Remember that set returns the new value of the variable: X: abcdef\12345 Y: abcdef\12345