0

我有一个包含两列的现有数据表,一是 ID,一是 ID 列表,以逗号分隔。

例如

ID | List 
---------
1  | 1, 4, 5
3  | 2, 12, 1

我想拆分列 List 以便我有一个像这样的表:

ID | List 
---------
1  | 1
1  | 4
1  | 5
3  | 2
3  | 12
3  | 1

我现在想通了:

tablename='Querysummary Data'
table=Document.Data.Tables[tablename]

topiccolname='TOPIC_ID'
topiccol=table.Columns[topiccolname]
topiccursor=DataValueCursor.Create[str](topiccol)

docscolname='DOC_IDS'
doccol=table.Columns[docscolname]
doccursor=DataValueCursor.Create[str](doccol)

myPanel = Document.ActivePageReference.FilterPanel
idxSet =  myPanel.FilteringSchemeReference.FilteringSelectionReference.GetSelection(table).AsIndexSet()


keys=dict()
topdoc=dict()
for row in table.GetRows(idxSet,topiccursor,doccursor):
   keys[topiccursor.CurrentValue]=doccursor.CurrentValue

for key in keys:
    str = keys[key].split(",")

    for i in str:
        topdoc[key]=i
        print key + " " +i

现在我可以用相应的 id 打印主题 id。如何使用这个 dict() 在 Spotfire 中创建一个新的数据表?

4

1 回答 1

1

我终于自己解决了..也许有一些更好的代码,但它有效:

tablename='Querysummary Data'
table=Document.Data.Tables[tablename]

topiccolname='TOPIC_ID'
topiccol=table.Columns[topiccolname]
topiccursor=DataValueCursor.Create[str](topiccol)

docscolname='DOC_IDS'
doccol=table.Columns[docscolname]
doccursor=DataValueCursor.Create[str](doccol)

myPanel = Document.ActivePageReference.FilterPanel
idxSet =  myPanel.FilteringSchemeReference.FilteringSelectionReference.GetSelection(table).AsIndexSet()

# build a string representing the data in tab-delimited text format
textData = "TOPIC_ID;DOC_IDS\r\n"

keys=dict()
topdoc=dict()
for row in table.GetRows(idxSet,topiccursor,doccursor):
   keys[topiccursor.CurrentValue]=doccursor.CurrentValue

for key in keys:
    str = keys[key].split(",")

    for i in str:
        textData += key + ";" +  i + "\r\n"

dataSet = DataSet()
dataTable = DataTable("DOCIDS") 
dataTable.Columns.Add("TOPIC_ID", System.String) 
dataTable.Columns.Add("DOC_IDS", System.String) 

dataSet.Tables.Add(dataTable)

# make a stream from the string
stream = MemoryStream()
writer = StreamWriter(stream)
writer.Write(textData)
writer.Flush()
stream.Seek(0, SeekOrigin.Begin)

# set up the text data reader
readerSettings = TextDataReaderSettings()
readerSettings.Separator = ";"
readerSettings.AddColumnNameRow(0)
readerSettings.SetDataType(0, DataType.String)
readerSettings.SetDataType(1, DataType.String)
readerSettings.SetDataType(2, DataType.String)

# create a data source to read in the stream
textDataSource = TextFileDataSource(stream, readerSettings)

# add the data into a Data Table in Spotfire
if Document.Data.Tables.Contains("Querysummary Mapping"):
    Document.Data.Tables["Querysummary Mapping"].ReplaceData(textDataSource)
else:
    newTable = Document.Data.Tables.Add("Querysummary Mapping", textDataSource)
    tableSettings = DataTableSaveSettings (newTable, False, False)
    Document.Data.SaveSettings.DataTableSettings.Add(tableSettings)
于 2015-04-21T19:21:28.800 回答