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

时间:2015-02-23 23:55:08

标签: excel csv export output spss

我有一些来自SPSS的输出,我已将其导出为.txt文件(但也作为各种Excel格式)。以下是该文件的摘录。我需要观察到的和预期的相关百分比,这将发生在数百个这些输出(许多不同的对数线性模型)中。目前,它使用空格格式化为文本,而Excel则将整行格式化为单个单元格。我试图避免编写代码来破译这个,因为考虑到输出的整体大小,它们中的空间位置等等,这也很充实。

有没有人有任何想法?

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

 Observed, Expected Frequencies and Residuals

       Factor          Code              OBS. count & PCT.   EXP. count & PCT.      Residual   Std. Resid.   Adj. Resid.


  deg_code        0
   res_code        100
    edge_cod        2.520                    13.00 (  .29)      112.75 ( 2.56)      -99.7500       -9.3941       -9.8118
    edge_cod        0.630                    40.00 (  .91)      112.75 ( 2.56)      -72.7500       -6.8513       -7.1560
    edge_cod        0.315                   130.00 ( 2.95)      112.75 ( 2.56)       17.2500        1.6245        1.6968
    edge_cod        0.105                   194.00 ( 4.40)      112.75 ( 2.56)       81.2500        7.6518        7.9921
   res_code        85
    edge_cod        2.520                    21.00 (  .48)      112.75 ( 2.56)      -91.7500       -8.6407       -9.0249
    edge_cod        0.630                    60.00 ( 1.36)      112.75 ( 2.56)      -52.7500       -4.9678       -5.1887
    edge_cod        0.315                   136.00 ( 3.08)      112.75 ( 2.56)       23.2500        2.1896        2.2870
    edge_cod        0.105                   194.00 ( 4.40)      112.75 ( 2.56)       81.2500        7.6518        7.9921
   res_code        70
    edge_cod        2.520                    70.00 ( 1.59)      112.75 ( 2.56)      -42.7500       -4.0260       -4.2051
    edge_cod        0.630                   117.00 ( 2.65)      112.75 ( 2.56)        4.2500         .4002         .4180
    edge_cod        0.315                   164.00 ( 3.72)      112.75 ( 2.56)       51.2500        4.8265        5.0412
    edge_cod        0.105                   214.00 ( 4.85)      112.75 ( 2.56)      101.2500        9.5354        9.9594

  deg_code        8
   res_code        100
    edge_cod        2.520                    17.00 (  .39)      120.08 ( 2.72)     -103.0833       -9.4069       -9.8252
    edge_cod        0.630                    56.00 ( 1.27)      120.08 ( 2.72)      -64.0833       -5.8480       -6.1080
    edge_cod        0.315                   138.00 ( 3.13)      120.08 ( 2.72)       17.9167        1.6350        1.7077
    edge_cod        0.105                   195.00 ( 4.42)      120.08 ( 2.72)       74.9167        6.8366        7.1405
   res_code        85
    edge_cod        2.520                    27.00 (  .61)      120.08 ( 2.72)      -93.0833       -8.4944       -8.8721
    edge_cod        0.630                    72.00 ( 1.63)      120.08 ( 2.72)      -48.0833       -4.3879       -4.5830
    edge_cod        0.315                   146.00 ( 3.31)      120.08 ( 2.72)       25.9167        2.3650        2.4702
    edge_cod        0.105                   200.00 ( 4.54)      120.08 ( 2.72)       79.9167        7.2928        7.6171
   res_code        70
    edge_cod        2.520                    82.00 ( 1.86)      120.08 ( 2.72)      -38.0833       -3.4753       -3.6298
    edge_cod        0.630                   119.00 ( 2.70)      120.08 ( 2.72)       -1.0833        -.0989        -.1033
    edge_cod        0.315                   172.00 ( 3.90)      120.08 ( 2.72)       51.9167        4.7377        4.9483
    edge_cod        0.105                   217.00 ( 4.92)      120.08 ( 2.72)       96.9167        8.8442        9.2374

  deg_code        16
   res_code        100
    edge_cod        2.520                    39.00 (  .88)      134.67 ( 3.05)      -95.6667       -8.2439       -8.6104
    edge_cod        0.630                    67.00 ( 1.52)      134.67 ( 3.05)      -67.6667       -5.8310       -6.0903
    edge_cod        0.315                   132.00 ( 2.99)      134.67 ( 3.05)       -2.6667        -.2298        -.2400
    edge_cod        0.105                   211.00 ( 4.78)      134.67 ( 3.05)       76.3333        6.5779        6.8703
   res_code        85
    edge_cod        2.520                    48.00 ( 1.09)      134.67 ( 3.05)      -86.6667       -7.4683       -7.8004
    edge_cod        0.630                    87.00 ( 1.97)      134.67 ( 3.05)      -47.6667       -4.1076       -4.2902
    edge_cod        0.315                   161.00 ( 3.65)      134.67 ( 3.05)       26.3333        2.2692        2.3701
    edge_cod        0.105                   212.00 ( 4.81)      134.67 ( 3.05)       77.3333        6.6640        6.9603
   res_code        70
    edge_cod        2.520                    92.00 ( 2.09)      134.67 ( 3.05)      -42.6667       -3.6767       -3.8402
    edge_cod        0.630                   151.00 ( 3.42)      134.67 ( 3.05)       16.3333        1.4075        1.4701
    edge_cod        0.315                   195.00 ( 4.42)      134.67 ( 3.05)       60.3333        5.1991        5.4303
    edge_cod        0.105                   221.00 ( 5.01)      134.67 ( 3.05)       86.3333        7.4396        7.7704

4 个答案:

答案 0 :(得分:1)

在Excel中,您可以使用Text to Columns(空格作为分隔符)将单个单元格解析为多个单元格。完成后,您可以选择将结果保存为字符分隔值,如果您更喜欢.csv格式。

答案 1 :(得分:1)

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

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

   *Export Output to Excel.
  OUTPUT EXPORT
  /CONTENTS  EXPORT=ALL  LAYERS=PRINTSETTING  MODELVIEWS=PRINTSETTING
  /XLS  DOCUMENTFILE='C:\FILEPATHHERE'
     OPERATION=CREATEFILE
     LOCATION=LASTCOLUMN  NOTESCAPTIONS=YES.

收到文件后,您会注意到所有数据/输出都在第1列中。

  1. 选择数据列
  2. 点击数据>文本到功能区中的列
  3. 选择“分隔”>下
  4. 确保“text”和“将连续分隔符视为一个”是所有选中的>下一页
  5. 最后,您可以调整数据类型或只是完成。
  6. 这是一个我所知道的简单过程,但多年来我一直倾向于人们对这些事情有不同程度的了解,虽然Stackoverflow的常客可能就此而言,奇怪的Google员工可能不会。

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

    -Alex

答案 2 :(得分:1)

您是否已使用GENLOG而不是旧的LOGLINEAR程序(仅生成纯文本输出)? GENLOG(分析>对数线性>常规)生成常规数据透视表输出以及残差和预测值变量,因此可以使用输出导出或OMS将其输出直接导出到Excel,而无需在Excel上进行操作

答案 3 :(得分:1)

我必须同意JKP,使用较新的GENLOG程序可能是一种更好的方法。但是,在某些情况下,您可能希望将文本输出转换为csv文件。因此,我想分享这个解决方案。

在这个解决方案中,我借助SpssClient Python类grep查看器输出,然后使用一些本地函数来操作文本输出并将其保存为csv文件。

作为示例数据,我使用' demo.sav'来自SPSS示例文件。

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