Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to split string and store in list via TCL

Tags:

tcl

Is there a way to split strings and save in a list ? How to split string and save in two list For example, I have a string where I split several string with =:

a=1
b=2
c=3
d=4

and then I want to create two list like this [a,b,c,d] and [1,2,3,4]:

like image 507
user2901871 Avatar asked Oct 28 '13 05:10

user2901871


3 Answers

Following is a simple tcl code

set s "a=1\nb=2\nc=3\nd=4"
set s [split $s "\n"]
foreach e $s {
    set e [split $e "="]
    lappend l1 [lindex $e 0]
    lappend l2 [lindex $e 1]
}

Now you have list l1 with [a b c d] and l2 has [1 2 3 4]

like image 111
Sohail Zakriya Avatar answered Nov 15 '22 10:11

Sohail Zakriya


The simplest way is to read all the data in, split into lines, and then use regexp with each line to extract the pieces.

set f [open "theFile.txt"]
set lines [split [read $f] "\n"]
close $f

set keys [set values {}]
foreach line $lines {
    if {[regexp {^([^=]*)=(.*)$} $line -> key value]} {
        lappend keys $key
        lappend values $value
    } else {
        # No '=' in the line!!!
    }
}

# keys in $keys, values in $values

puts "keys = \[[join $keys ,]\]"
puts "values = \[[join $values ,]\]"

Run that (assuming that the filename is right) and you'll get output like:

keys = [a,b,c,d]
values = [1,2,3,4]

Collecting two lists like that might not be the best thing to do with such stuff. Often, it is better to instead to store in an array:

# Guarded by that [regexp] inside the foreach
set myArray($key) $value

Like that, you can do lookups by name rather than having to manually search. Assuming that keys are unique and order doesn't matter.

like image 40
Donal Fellows Avatar answered Nov 15 '22 10:11

Donal Fellows


A simple way might be using a loop:

% set lines "a=1\nb=2\nc=3\nd=4"
a=1
b=2
c=3
d=4
% set expressionList [split $lines "\n"]
a=1 b=2 c=3 d=4
% set var [list]
% set val [list]
% foreach i $expressionList {
    set variable [lindex [split $i "="] 0]
    set value [lindex [split $i "="] 1]
    lappend val $value
    lappend var $variable
}
% puts $var
a b c d
% puts $val
1 2 3 4

If you don't mind a regex, you might try something like this:

% set lines "a=1\nb=2\nc=3\nd=4"
a=1
b=2
c=3
d=4
% set var [regexp -inline -lineanchor -all -- {^[^=\n\r]+} $lines]
a b c d
% set val [regexp -inline -lineanchor -all -- {[^=\n\r]+$} $lines]
1 2 3 4
like image 44
Jerry Avatar answered Nov 15 '22 09:11

Jerry