Excel 以有意义的格式导出SPSS输出(例如csv、tab)?

Excel 以有意义的格式导出SPSS输出(例如csv、tab)?,excel,csv,export,output,spss,python,Excel,Csv,Export,Output,Spss,Python,我有一些来自SPSS的输出,我已经将其导出为.txt文件(也可以导出为各种Excel格式)。下面是该文件的一个片段。我需要观察到的和预期的相关百分比,这将发生在数百个这样的输出中(许多不同的对数线性模型)。目前,它的格式是以空格作为文本,以Excel格式将整行放在一个单元格中。我试图避免必须编写代码来破译这一点,因为考虑到输出的总体大小、输出中空间的位置等因素,这也会令人担忧 有人有什么想法吗 一个明确的解决方案是使用不同的软件包,但是在SPSS LOGLINEAR语法中为我指定多项式对比度和计

我有一些来自SPSS的输出,我已经将其导出为.txt文件(也可以导出为各种Excel格式)。下面是该文件的一个片段。我需要观察到的和预期的相关百分比,这将发生在数百个这样的输出中(许多不同的对数线性模型)。目前,它的格式是以空格作为文本,以Excel格式将整行放在一个单元格中。我试图避免必须编写代码来破译这一点,因为考虑到输出的总体大小、输出中空间的位置等因素,这也会令人担忧

有人有什么想法吗

一个明确的解决方案是使用不同的软件包,但是在SPSS LOGLINEAR语法中为我指定多项式对比度和计算权重的能力在其他地方无法实现(即,这可能是可能的,但超出了我的技能)


在Excel中,您可以使用文本到列,并以空格作为分隔符,将单个单元格解析为多个单元格。完成此操作后,如果您喜欢.csv格式,您可以选择将结果保存为字符分隔值。

在Excel中,您可以使用文本到列,并使用空格作为分隔符,将单个单元格解析为多个单元格。如果您更喜欢.csv格式,那么您可以选择将结果保存为字符分隔的值。

对于来自谷歌的人,@pnuts给了我一个简单的答案,我忽略了这个答案;Excel中的“文本到列”

对于那些不知道的人(我不知道),将SPSS数据输出为Excel转换为可用(即单元格中的值)格式的过程如下: 右键单击并选择“导出”,选择excel格式和目标,从SPSS导出数据输出。或者,您可以使用以下语法(填写文件路径):

一旦有了文件,您会注意到所有数据/输出都在第1列中

  • 选择数据列
  • 单击“数据>文本”以在功能区中显示列
  • 选择“分隔”>下一步
  • 确保“文本”和“将连续分隔符视为一个”都是选中的>下一步
  • 最后,您可以调整数据类型,也可以简单地完成
  • 我知道这是一个简单的过程,但多年来我一直认为人们对这类事情有不同程度的了解,尽管经常访问Stackoverflow的人可能会对这一点感兴趣,但奇怪的谷歌人可能不会

    编辑* 我目前使用的另一种解决方案(一次仅用于少数输出)是右键单击SPSS中的“复制特殊”作为文本,然后在excel中粘贴特殊,并保留源格式。这可能是比我聪明的人制作的宏


    -Alex

    对于那些来自谷歌的人,@pnuts给了我一个我忽略了的简单答案;Excel中的“文本到列”

    对于那些不知道的人(我不知道),将SPSS数据输出为Excel转换为可用(即单元格中的值)格式的过程如下: 右键单击并选择“导出”,选择excel格式和目标,从SPSS导出数据输出。或者,您可以使用以下语法(填写文件路径):

    一旦有了文件,您会注意到所有数据/输出都在第1列中

  • 选择数据列
  • 单击“数据>文本”以在功能区中显示列
  • 选择“分隔”>下一步
  • 确保“文本”和“将连续分隔符视为一个”都是选中的>下一步
  • 最后,您可以调整数据类型,也可以简单地完成
  • 我知道这是一个简单的过程,但多年来我一直认为人们对这类事情有不同程度的了解,尽管经常访问Stackoverflow的人可能会对这一点感兴趣,但奇怪的谷歌人可能不会

    编辑* 我目前使用的另一种解决方案(一次仅用于少数输出)是右键单击SPSS中的“复制特殊”作为文本,然后在excel中粘贴特殊,并保留源格式。这可能是比我聪明的人制作的宏


    -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.