2016-08-10 4 views
1

У меня есть сценарий IronPython, который я использую для экспорта всех моих таблиц данных из проекта Spotfire.Экспорт данных из Spotfire в CSV с использованием скрипта IronPython

В настоящее время он работает отлично. Он перебирает все типы данных и экспортирует их как «.xlsx». Теперь мне нужно экспортировать файлы как «.csv», которые, как я думал, будут такими же простыми, как изменение «.xlsx» на «.csv».

Этот сценарий по-прежнему экспортирует файлы, называет их всеми .csv, но то, что находится внутри файла, является .xlsx, Im не уверен, как и почему. Код просто меняет имя расширения файла, но не конвертирует файл в csv.

Вот код, я в настоящее время с помощью:

Я отправил весь код в нижней части, и код, который я считаю, имеет отношение к моему вопросу в отдельном блоке кода в верхней части.

if(dialogResult == DialogResult.Yes): 
    for d in tableList: #cycles through the table list elements defined above 
     writer = Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.ExcelXlsDataWriter) 
     table = Document.Data.Tables[d[0]] #d[0] is the Data Table name in the Spotfire project (defined above) 
     filtered = Document.ActiveFilteringSelectionReference.GetSelection(table).AsIndexSet() #OR pass the filter 
     stream = File.OpenWrite(savePath+'\\'+ d[1] +".csv") #d[1] is the Excel alias name. You could also use d.Name to export with the Data Table name 
     names = [] 
     for col in table.Columns: 
      names.append(col.Name) 
     writer.Write(stream, table, filtered, names) 
     stream.Close() 

Я думаю, что это может иметь отношение к ExcelXlsDataWriter. Я также попытался использовать ExcelXlsxDataWriter. Есть ли сценарий csv, который я мог бы использовать для этого? Я считаю, что файлы csv и txt имеют разные записи.

Любая помощь приветствуется.

Полный сценарий показан ниже:

import System 
import clr 
import sys 

clr.AddReference("System.Windows.Forms") 
from sys import exit 
from System.Windows.Forms import FolderBrowserDialog, MessageBox, MessageBoxButtons, DialogResult 
from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers 
from System.IO import File, FileStream, FileMode 

#This is a list of Data Tables and their Excel file names. You can see each referenced below as d[0] and d[1] respectively. 
tableList = [ 
      ["TestTable1"], 
      ["TestTable2"], 
      ] 

#imports the location of the file so that there is a default place to put the exports. 
from Spotfire.Dxp.Application import DocumentMetadata 
dmd = Application.DocumentMetadata #Get MetaData 
path = str(dmd.LoadedFromFileName) #Get Path 
savePath = '\\'.join(path.split('\\')[0:-1]) + "\\DataExports\\" 

dialogResult = MessageBox.Show("The files will be save to "+savePath 
       +". Do you want to change location?" 
       , "Select the save location", MessageBoxButtons.YesNo) 
if(dialogResult == DialogResult.Yes): 
    # GETS THE FILE PATH FROM THE USER THROUGH A FILE DIALOG instead of using the file location 
    SaveFile = FolderBrowserDialog() 
    SaveFile.ShowDialog() 
    savePath = SaveFile.SelectedPath 

#message making sure that the user wants to exporthe files. 
dialogResult = MessageBox.Show("Export Files." 
           +" Export Files","Are you sure?", MessageBoxButtons.YesNo) 
if(dialogResult == DialogResult.Yes): 
    for d in tableList: #cycles through the table list elements defined above 
     writer = Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.ExcelXlsDataWriter) 
     table = Document.Data.Tables[d[0]] #d[0] is the Data Table name in the Spotfire project (defined above) 
     filtered = Document.ActiveFilteringSelectionReference.GetSelection(table).AsIndexSet() #OR pass the filter 
     stream = File.OpenWrite(savePath+'\\'+ d[1] +".csv") #d[1] is the Excel alias name. You could also use d.Name to export with the Data Table name 
     names = [] 
     for col in table.Columns: 
      names.append(col.Name) 
     writer.Write(stream, table, filtered, names) 
     stream.Close() 

#if the user doesn't want to export then he just gets a message 
else: 
    dialogResult = MessageBox.Show("ok.") 

ответ

1

По какой-то причине реализация Spotfire Iron Python не поддерживает пакет CSV, реализованный в Python.

Обходной путь, который я нашел для вашей реализации, использует StdfDataWriter вместо ExcelXsDataWriter. Формат данных STDF: Spotfire Text Data Format. Класс DataWriter в Spotfire поддерживает только Excel и STDF (see here), а STDF - ближе всего к CSV.

from System.IO import File 
from Spotfire.Dxp.Data.Export import DataWriterTypeIdentifiers 

writer = Document.Data.CreateDataWriter(DataWriterTypeIdentifiers.StdfDataWriter) 
table = Document.Data.Tables['DropDownSelectors'] 
filtered = Document.ActiveFilteringSelectionReference.GetSelection(table).AsIndexSet() 
stream = File.OpenWrite("C:\Users\KLM68651\Documents\dropdownexport.stdf") 
names =[] 
for col in table.Columns: 
    names.append(col.Name) 
writer.Write(stream, table, filtered, names) 
stream.Close() 

Надеется, что это помогает

+0

Спасибо, что облом, что Spotfire не экспортирует в формате CSV. STDF экспортируется быстро, но тогда мне пришлось бы пройти какую-то пакетную обработку для преобразования в csv. Что я уже имею в виду с xlsx .... Еще раз спасибо. – brandog

Смежные вопросы