본문 바로가기
Data Analysis/Spotfire

[Spotfire & Python] Dxp 파일 안의 선택한 Data Table 합치기

by 불탄오징어 2020. 11. 15.
반응형

 

 

어쩌다 보니 비슷한 내용의 글이 연속해서 올라갑니다. 연작.. 이 되어버렸네요.

 

bongury.tistory.com/457

 

[TIBCO Spotfire] Python 활용 예제 : 현재 Dxp 파일 안의 Data Table List 가져오기

안녕하세요 불탄오징어입니다. 위의 질문이 있어서 간단하게 포스팅을 해봤습니다. 알고보면 그렇게 어렵진 않아서 댓글로 답을 달려다가 댓글 가독성도 떨어지고 샘플 파일이 있으면 이해하

bongury.tistory.com

bongury.tistory.com/459

 

[TIBCO Spotfire] Python 활용 : 현재 Dxp 파일 안의 Data Table 모두 합치기

Spotfire에서 기본 기능으로 동일한 칼럼을 가진 데이터 테이블을 하나의 테이블로 합칠 수는 있습니다. 그런데 만약 합쳐야 할 테이블이 수십개라면 그런 작업마저도 힘들 수 있죠. 아래의 예제

bongury.tistory.com

 

가장 최근에 올린 포스팅에서는 dxp 안에 있는 모든 Data Table을 알아서 하나의 테이블로 합치는 예제였습니다. 그런데 이왕이면 선택해서 합칠 수 있으면 좋겠다 싶어서 한번 만들어봤습니다. 샘플 데이터는 기존과 동일합니다만 몇가지 상관없을 만한 Data Table들을 추가해놨습니다. 

 

 

여러개의 테이블을 하나의 Data Table로 합치려면 일단 Column 명이 같아야 합니다. 다를 경우 합쳐지지 않습니다. 여러개의 테이블을 선택해서 합치게되면 Column명이 같은 것은 합치고 그외의 것은 무시합니다.

 

 

예제 화면


 

기본적인 화면 구성입니다. 가져오기 버튼을 누르면 현재 DXP에 등록된 모든 Data Table 의 목록을 가져와서 "DataTable List" 테이블에 넣어둡니다. (단 DataTable List, All Data Table)은 제외입니다. 

 

 

그 다음 합칠 Data Table을 선택합니다. 먼저 Data Table1~3까지 선택한 후 모두 합치기를 클릭합니다. 

 

 

지정한 테이블들을 모두 합치고 테이블 구분이라는 칼럼을 만들어서 구분이 가능하게끔 생성합니다. 

 

 

Script


1. 가져오기 Script

from Spotfire.Dxp.Data import AddRowsSettings,DataTable
from System.IO import  StreamWriter, MemoryStream, SeekOrigin
from Spotfire.Dxp.Data import DataType, DataTableSaveSettings,RowSelection, IndexSet
from Spotfire.Dxp.Data.Import import TextFileDataSource, TextDataReaderSettings,DataTableDataSource

dataTableName = "DataTable List"

#Clear your table designated by 'MyTable' script parameter
table = Document.Data.Tables[dataTableName]
table.RemoveRows(RowSelection(IndexSet(table.RowCount,True)))

# 현재 dxp 파일에 Load 된 모든 Data Table의 리스트를 가져옴
tables = Document.Data.Tables

# 빈 List 생성
TableList = []
for table in tables:
	
	if table.Name != dataTableName and table.Name != "All Data Table":
		TableList.append(table.Name) # Name 속성으로 테이블 명 추출

tablesName = "DataTable\r\n" + ("\r\n").join(TableList)


stream = MemoryStream()
csvWriter = StreamWriter(stream)#, Encoding.UTF8)
csvWriter.WriteLine(tablesName)
csvWriter.Flush()
stream.Seek(0, SeekOrigin.Begin)

readerSettings = TextDataReaderSettings()    
readerSettings.AddColumnNameRow(0)
#settings.ClearDataTypes(False)
readerSettings.SetDataType(0, DataType.String)   

textDataSource = TextFileDataSource(stream, readerSettings)


if Document.Data.Tables.Contains(dataTableName):
	Document.Data.Tables[dataTableName].ReplaceData(textDataSource)
else:
	Document.Data.Tables.Add(dataTableName, textDataSource)

 

 

2. 모두 합치기 Script

from Spotfire.Dxp.Data import *
from Spotfire.Dxp.Data.Import import DataTableDataSource

def getDataTable(tableName):
    try:
        return Document.Data.Tables[tableName]
    except:        
        return None

# 모두 합칠 테이블명 지정
newTableName = 'All Data Table'

# 기존 통합 테이블이 있는지 확인 후 초기화
dt = getDataTable(newTableName)
#if dt != None:
#	Document.Data.Tables.Remove(dt)
	
# 데이터 테이블 목록 수집
tableList = Document.Data.Tables["DataTable List"]
col = DataValueCursor.CreateFormatted(tableList.Columns["DataTable"])

markedRows = Document.Data.Markings["Marking"].GetSelection(tableList).AsIndexSet()

tables = []
for row in tableList.GetRows(markedRows, col):
	tables.append(col.CurrentValue)

#tables = Document.Data.Tables

# 이전 테이블 명 저장용 : Add row 후 구분값으로 입력
preTableName = ""

# 테이블 순서 저장용
nTime = 0

for table in tables:

	# 테이블명에 Data Table 문자가 포함된 테이블만 선택
	if (table.find("Data Table") >= 0 and table != newTableName and table != "DataTable List") :
		nTime = nTime + 1

		print(nTime)
		print(table)
		print(preTableName)


		# Data Table 소스 설정
		inputTableDS = DataTableDataSource(Document.Data.Tables[table])		

		if nTime == 1:
			# 통합테이블 생성 후 첫 테이블 삽입
			if dt != None:
				outputTable = Document.Data.Tables[newTableName]
				outputTable.ReplaceData(inputTableDS)
			else:
				Document.Data.Tables.Add(newTableName, inputTableDS)					
				outputTable = Document.Data.Tables[newTableName]
		elif nTime == 2:
			# 테이블은 합친뒤 테이블구분이라는 칼럼 생성 후 테이블 명입력
			addRowsSettings = AddRowsSettings(outputTable, inputTableDS, "테이블구분", table, preTableName)
			outputTable.AddRows(inputTableDS, addRowsSettings)
		else:			
			# 테이블은 합친뒤 테이블구분이라는 칼럼 생성 후 테이블 명입력
			addRowsSettings = AddRowsSettings(outputTable, inputTableDS, "테이블구분", table)
			outputTable.AddRows(inputTableDS, addRowsSettings)			

		preTableName = table

	else :
		print("No")

 

 

예제 파일


sample_addrow_python_withMarkings.dxp
0.14MB

댓글