Excel 以有意义的格式导出SPSS输出(例如csv、tab)?
我有一些来自SPSS的输出,我已经将其导出为.txt文件(也可以导出为各种Excel格式)。下面是该文件的一个片段。我需要观察到的和预期的相关百分比,这将发生在数百个这样的输出中(许多不同的对数线性模型)。目前,它的格式是以空格作为文本,以Excel格式将整行放在一个单元格中。我试图避免必须编写代码来破译这一点,因为考虑到输出的总体大小、输出中空间的位置等因素,这也会令人担忧 有人有什么想法吗 一个明确的解决方案是使用不同的软件包,但是在SPSS LOGLINEAR语法中为我指定多项式对比度和计算权重的能力在其他地方无法实现(即,这可能是可能的,但超出了我的技能)Excel 以有意义的格式导出SPSS输出(例如csv、tab)?,excel,csv,export,output,spss,python,Excel,Csv,Export,Output,Spss,Python,我有一些来自SPSS的输出,我已经将其导出为.txt文件(也可以导出为各种Excel格式)。下面是该文件的一个片段。我需要观察到的和预期的相关百分比,这将发生在数百个这样的输出中(许多不同的对数线性模型)。目前,它的格式是以空格作为文本,以Excel格式将整行放在一个单元格中。我试图避免必须编写代码来破译这一点,因为考虑到输出的总体大小、输出中空间的位置等因素,这也会令人担忧 有人有什么想法吗 一个明确的解决方案是使用不同的软件包,但是在SPSS LOGLINEAR语法中为我指定多项式对比度和计
在Excel中,您可以使用文本到列,并以空格作为分隔符,将单个单元格解析为多个单元格。完成此操作后,如果您喜欢.csv格式,您可以选择将结果保存为字符分隔值。在Excel中,您可以使用文本到列,并使用空格作为分隔符,将单个单元格解析为多个单元格。如果您更喜欢.csv格式,那么您可以选择将结果保存为字符分隔的值。对于来自谷歌的人,@pnuts给了我一个简单的答案,我忽略了这个答案;Excel中的“文本到列” 对于那些不知道的人(我不知道),将SPSS数据输出为Excel转换为可用(即单元格中的值)格式的过程如下: 右键单击并选择“导出”,选择excel格式和目标,从SPSS导出数据输出。或者,您可以使用以下语法(填写文件路径): 一旦有了文件,您会注意到所有数据/输出都在第1列中
-Alex对于那些来自谷歌的人,@pnuts给了我一个我忽略了的简单答案;Excel中的“文本到列” 对于那些不知道的人(我不知道),将SPSS数据输出为Excel转换为可用(即单元格中的值)格式的过程如下: 右键单击并选择“导出”,选择excel格式和目标,从SPSS导出数据输出。或者,您可以使用以下语法(填写文件路径): 一旦有了文件,您会注意到所有数据/输出都在第1列中
-Alex您是否使用GENLOG而不是只生成纯文本输出的非常旧的LOGLINEAR过程进行了联合排序?GENLOG(Analyze>Loglinear>General)生成常规数据透视表输出以及残差和预测值变量,因此其输出可以使用输出导出或OMS直接导出到Excel,而无需在Excel上大惊小怪您是否使用GENLOG而不是非常旧的Loglinear过程进行协同排序,哪个只生成纯文本输出?GENLOG(Analyze>Loglinear>General)生成常规数据透视表输出以及残差和预测值变量,因此其输出可以使用输出导出或OMS直接导出到Excel,而无需在Excel上大惊小怪我同意JKP,使用较新的GENLOG程序可能是更好的方法。但是,在某些情况下,您可能希望将文本输出转换为csv文件。因此,我想分享这个解决方案 在这个解决方案中,我在SpssClient Python类的帮助下对查看器输出进行grep处理,然后使用一些本机函数来操作文本输出并将其保存为csv文件 作为示例数据,我使用SPSS示例文件中的“demo.sav”
**** create some sample output ****.
GET FILE='/opt/IBM/SPSS/Statistics/22/Samples/English/demo.sav'.
LOGLINEAR inccat (1,4) jobsat (1,5)
/DESIGN inccat.
LOGLINEAR inccat (1,4) ownpc (0,1)
/DESIGN inccat.
**** transform output to csv files ****
BEGIN PROGRAM.
import csv
import re
import os
import SpssClient
# define directory where the csv files will be stored
os.chdir("/your/path/to/directory/")
# define csv file basename
basename = 'loglin'
# define delimeter for csv files
delim = ';'
SpssClient.StartClient()
OutputDoc = SpssClient.GetDesignatedOutputDoc()
OutputItems = OutputDoc.GetOutputItems()
# create list wich contains the several text outputs
# of the LogLinear procedures
TextItems = []
for index in range(OutputItems.Size()):
OutputItem = OutputItems.GetItemAt(index)
if (OutputItem.GetType() == SpssClient.OutputItemType.TEXT
and OutputItem.GetProcedureName() == 'Loglinear'):
TextItem = OutputItem.GetSpecificType()
TextItems.append(TextItem.GetTextContents())
SpssClient.StopClient()
# some fine tuning, so that actual values get into
# one table cell, without brackets and stuff like that
def stringadj (astring):
astring = re.sub(r' +\( *', delim, astring) # replace left bracket by delimeter
astring = re.sub(r'\)', '', astring) # remove right bracket
astring = re.sub(r' & ', delim, astring) # replace '&' by delimeter
astring = re.sub(r'= ?', '=' + delim, astring) # replace '=' by delimeter
astring = re.sub(delim + delim, delim, astring) # replace double delimeter by single delimeter
return astring
# define cvs style
csv.register_dialect('loglinstyle', delimiter=delim)
# split output strings into several lines
# do necessary text adjustments
# and store each output in a seperate (enumerated) csv file
for position, item in enumerate(TextItems):
lltable = [re.sub(r' ( )+', delim, line.lstrip().rstrip()) for line in item.split("\n")]
lltable = [stringadj(line) for line in lltable]
filename = basename + str(position+1) + '.csv'
with open(filename, 'wb') as f:
writer = csv.writer(f, 'loglinstyle')
writer.writerows(csv.reader(lltable, 'loglinstyle'))
END PROGRAM.
我必须同意JKP,使用更新的GENLOG过程可能是更好的方法。但是,在某些情况下,您可能希望将文本输出转换为csv文件。因此,我想分享这个解决方案 在这个解决方案中,我在SpssClient Python类的帮助下对查看器输出进行grep处理,然后使用一些本机函数来操作文本输出并将其保存为csv文件 作为示例数据,我使用SPSS示例文件中的“demo.sav”
**** create some sample output ****.
GET FILE='/opt/IBM/SPSS/Statistics/22/Samples/English/demo.sav'.
LOGLINEAR inccat (1,4) jobsat (1,5)
/DESIGN inccat.
LOGLINEAR inccat (1,4) ownpc (0,1)
/DESIGN inccat.
**** transform output to csv files ****
BEGIN PROGRAM.
import csv
import re
import os
import SpssClient
# define directory where the csv files will be stored
os.chdir("/your/path/to/directory/")
# define csv file basename
basename = 'loglin'
# define delimeter for csv files
delim = ';'
SpssClient.StartClient()
OutputDoc = SpssClient.GetDesignatedOutputDoc()
OutputItems = OutputDoc.GetOutputItems()
# create list wich contains the several text outputs
# of the LogLinear procedures
TextItems = []
for index in range(OutputItems.Size()):
OutputItem = OutputItems.GetItemAt(index)
if (OutputItem.GetType() == SpssClient.OutputItemType.TEXT
and OutputItem.GetProcedureName() == 'Loglinear'):
TextItem = OutputItem.GetSpecificType()
TextItems.append(TextItem.GetTextContents())
SpssClient.StopClient()
# some fine tuning, so that actual values get into
# one table cell, without brackets and stuff like that
def stringadj (astring):
astring = re.sub(r' +\( *', delim, astring) # replace left bracket by delimeter
astring = re.sub(r'\)', '', astring) # remove right bracket
astring = re.sub(r' & ', delim, astring) # replace '&' by delimeter
astring = re.sub(r'= ?', '=' + delim, astring) # replace '=' by delimeter
astring = re.sub(delim + delim, delim, astring) # replace double delimeter by single delimeter
return astring
# define cvs style
csv.register_dialect('loglinstyle', delimiter=delim)
# split output strings into several lines
# do necessary text adjustments
# and store each output in a seperate (enumerated) csv file
for position, item in enumerate(TextItems):
lltable = [re.sub(r' ( )+', delim, line.lstrip().rstrip()) for line in item.split("\n")]
lltable = [stringadj(line) for line in lltable]
filename = basename + str(position+1) + '.csv'
with open(filename, 'wb') as f:
writer = csv.writer(f, 'loglinstyle')
writer.writerows(csv.reader(lltable, 'loglinstyle'))
END PROGRAM.
@pnuts这是一个足够的解决方案,谢谢提示。不过,我不知道如何回答您的评论?@pnuts也许它更适合StackExchange。我使用了SPSS Python模块并找到了一种保存的方法
**** create some sample output ****.
GET FILE='/opt/IBM/SPSS/Statistics/22/Samples/English/demo.sav'.
LOGLINEAR inccat (1,4) jobsat (1,5)
/DESIGN inccat.
LOGLINEAR inccat (1,4) ownpc (0,1)
/DESIGN inccat.
**** transform output to csv files ****
BEGIN PROGRAM.
import csv
import re
import os
import SpssClient
# define directory where the csv files will be stored
os.chdir("/your/path/to/directory/")
# define csv file basename
basename = 'loglin'
# define delimeter for csv files
delim = ';'
SpssClient.StartClient()
OutputDoc = SpssClient.GetDesignatedOutputDoc()
OutputItems = OutputDoc.GetOutputItems()
# create list wich contains the several text outputs
# of the LogLinear procedures
TextItems = []
for index in range(OutputItems.Size()):
OutputItem = OutputItems.GetItemAt(index)
if (OutputItem.GetType() == SpssClient.OutputItemType.TEXT
and OutputItem.GetProcedureName() == 'Loglinear'):
TextItem = OutputItem.GetSpecificType()
TextItems.append(TextItem.GetTextContents())
SpssClient.StopClient()
# some fine tuning, so that actual values get into
# one table cell, without brackets and stuff like that
def stringadj (astring):
astring = re.sub(r' +\( *', delim, astring) # replace left bracket by delimeter
astring = re.sub(r'\)', '', astring) # remove right bracket
astring = re.sub(r' & ', delim, astring) # replace '&' by delimeter
astring = re.sub(r'= ?', '=' + delim, astring) # replace '=' by delimeter
astring = re.sub(delim + delim, delim, astring) # replace double delimeter by single delimeter
return astring
# define cvs style
csv.register_dialect('loglinstyle', delimiter=delim)
# split output strings into several lines
# do necessary text adjustments
# and store each output in a seperate (enumerated) csv file
for position, item in enumerate(TextItems):
lltable = [re.sub(r' ( )+', delim, line.lstrip().rstrip()) for line in item.split("\n")]
lltable = [stringadj(line) for line in lltable]
filename = basename + str(position+1) + '.csv'
with open(filename, 'wb') as f:
writer = csv.writer(f, 'loglinstyle')
writer.writerows(csv.reader(lltable, 'loglinstyle'))
END PROGRAM.