如何在IronPython(Spotfire)中拆分以逗号分隔的列表?

时间:2015-04-20 20:43:05

标签: python split ironpython spotfire

我有一个包含两列的现有数据表,一列是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中创建新数据表?

1 个答案:

答案 0 :(得分: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)