2017-09-03 2 views
-1

von einem unbekannten Grund der Variable result in der folgenden CodezeileWie intrigiere ich Tcl "Liste als String" als Liste?

set result [[$sqlCmd execute] allrows -as lists] 

bekommt Zeichenfolge, die wie die Liste aussieht: {2 3 4 5}

Wenn ich puts "result $result => [llength $result]" schreiben druckt {2 3 4 5} => 1

wenn ich puts [list $result] schreiben, Es druckt {{2 3 4 5}}, was korrekt ist, weil list Liste aus einer Zeichenfolge erstellt.
Gibt es eine Möglichkeit, diese Zeichenfolge in das zu konvertieren, was sie erwartet - Liste - ohne irgendwelche String-Verarbeitungsschritte wie das Löschen von geschweiften Klammern und das Aufteilen von Strings zur Liste nach split Funktion? Ich schlage vor, dass es eine Interpretation sein muss, aber ich finde keine schöne Lösung.

+0

Kein TCL-Experte, aber es sieht so aus, als ob Ihr SQL-Befehl Ihnen eine Länge-1-Liste gibt, deren 1 Element eine andere Liste ist. Wenn der Befehl zwei Zeilen ausgewählt hätte, hätten Sie eine Liste mit der Länge 2 erhalten, deren Elemente einzelne Listen für einzelne Zeilen wären. – user2357112

+0

@ user2357112 Ich bin mir nicht sicher, ob ich verstehe, was du meinst. Es sieht gut aus Vorschlag, dass die Liste der Länge-1 nicht Liste wird. Aber wie konnte das passieren? Und in der SQL Server-Konsole ausgeführt, gibt die Anfrage genau eine Datenzeile zurück, was erwartet wird. Also, warum eigentlich sollte es eine Liste von unterschiedlicher Länge zurückgeben. Bitte erläutern, was meinst du? – OlegG

+0

"liste der länge-1 wird nicht liste" - was? Nein, es ist immer noch eine Liste. Warum denkst du ist es nicht? – user2357112

Antwort

1

allrows gibt Ihnen eine Liste von Listen, wobei jede Unterliste eine Zeile darstellt. Es gibt 1 Reihe in dieser Liste, 2 3 4 5, also ist die Länge 1. Sie können über die Liste die üblichen Weisen indizieren oder iterieren, um auf sein einzelnes Element zuzugreifen.

# If you're assuming there will only be one row 
set only_row [lindex $result 0] 

# Or if you want to iterate over all rows 
foreach row $result { 
    do whatever with $row 
} 
+0

Diese Zeile sollte eine Liste sein. Aber es ist nicht. – OlegG

+0

@OlegG: Es * ist * eine Liste. – user2357112

+0

Ja. Der Code [lindex $ result 0 0] gibt 2 zurück. Danke! :) – OlegG

2

Die allrows Methode gibt immer eine Liste, eine pro Zeile (auch wenn es nur eine einzige Zeile zurückgegeben). Wenn die Option -as lists übergeben wird, ist jedes Element dieser Liste selbst eine Liste, die die Spalten in dieser Zeile darstellt.

So in den Spalten dieser Zeile zu wiederholen, würden Sie tun:

set result [[$sqlCmd execute] allrows -as lists] 
set rowresult [lindex $result 0] 
foreach col $rowresult { 
    puts "I've got a '$col'" 
} 

Sie sind in der Regel empfohlen, den Standard zu verwenden, die nach dem Spaltennamen indexiert Zeilen als Wörterbücher darstellt, wie eine hat bessere Darstellung von SQL NULL s (dh die Spalte fehlt dann, anstatt der vom Fahrer festgelegte Nullwert zu sein, der häufig und mehrdeutig die leere Zeichenfolge ist).

+0

Danke für Ihren Rat. Leider ist es nicht mein Fall. – OlegG