如何使用.SAS或SPS元数据文件读取CSV作为Pandas数据框?

时间:2019-10-24 04:33:16

标签: python pandas sas spss

我有一个很大的CSV文件,它带有两个元数据描述文件。一个扩展名为.sas,另一个扩展名为.sps。打开它们,它们描述CSV数据格式和类别。这些文件描述了数据格式以及每列的可能类别。例如,将值为1或2的列映射为 yes no

如何使用这些元数据文件帮助我读取CSV文件?

我可以使用read_csv轻松阅读它,但是这些文件对于自动创建具有可能类别的列很有用。我可以为他们创建一个解析器,但是必须有一个包或函数才能执行。也许我没有使用正确的搜索词。

这是.sas文件(很抱歉,它是葡萄牙语):

proc format;
Value $SG_AREA
        CH='Ciךncias Humanas'
        CN='Ciךncias da Natureza'
        LC='Linguagens e Cףdigos'
        MT='Matemבtica';

Value $TP_LINGUA
        0='Inglךs'
        1='Espanhol';

Value $IN_ITEM_ADAPTADO
        0='Nדo'
        1='Sim';


DATA WORK.ITENS_2018;
INFILE 'C:\ITENS_PROVA_2018.csv' /*local do arquivo*/
        LRECL=33
        FIRSTOBS=2
        DLM=';'
        MISSOVER
        DSD ;

INPUT
        CO_POSICAO       : BEST2.
        SG_AREA          : $CHAR2.
        CO_ITEM          : BEST6.
        TX_GABARITO      : $CHAR1.
        CO_HABILIDADE    : BEST2.
        TX_COR           : $CHAR7.
        CO_PROVA         : BEST3.
        TP_LINGUA        : $CHAR1.
        IN_ITEM_ADAPTADO : $CHAR1. ;

ATTRIB  SG_AREA          FORMAT = $SG_AREA20.;         
ATTRIB  TP_LINGUA        FORMAT = $TP_LINGUA8.;       
ATTRIB  IN_ITEM_ADAPTADO FORMAT = $IN_ITEM_ADAPTADO3.;

LABEL
CO_POSICAO='Posiחדo do Item na Prova'
SG_AREA='ֱrea de Conhecimento do Item'
CO_ITEM='Cףdigo do Item'
TX_GABARITO='Gabarito do Item'
CO_HABILIDADE='Habilidade do Item'
TX_COR='Cor da Prova'
CO_PROVA='Identificador da Prova'
TP_LINGUA='Lםngua Estrangeira '
IN_ITEM_ADAPTADO='Item pertencente א prova adaptada para Ledor'

;RUN;

在这里您可以看到等效的.sps文件:

GET DATA
  /TYPE=TXT
  /FILE= "C:\ITENS_PROVA_2018.csv" /*local do arquivo*/ 
  /DELCASE=LINE
  /DELIMITERS=";"
  /ARRANGEMENT=DELIMITED
  /FIRSTCASE=2
  /IMPORTCASE= ALL
  /VARIABLES=
CO_POSICAO F2.0
SG_AREA A2
CO_ITEM F6.0
TX_GABARITO A1
CO_HABILIDADE F2.0
TX_COR A7
CO_PROVA F3.0
TP_LINGUA A1       
IN_ITEM_ADAPTADO A1.
CACHE.
EXECUTE.
DATASET NAME ITENS_18 WINDOW=FRONT.

VARIABLE LABELS
CO_POSICAO  Posiחדo do Item na Prova
SG_AREA     ֱrea de Conhecimento do Item
CO_ITEM     Cףdigo do Item
TX_GABARITO Gabarito do Item
CO_HABILIDADE   Habilidade do Item
TX_COR      Cor da Prova
CO_PROVA    Identificador da Prova
TP_LINGUA       Lםngua Estrangeira
IN_ITEM_ADAPTADO    Item pertencente א prova adaptada para Ledor.


VALUE LABELS
SG_AREA
        "CH"    Ciךncias Humanas
        "CN"    Ciךncias da Natureza
        "LC"    Linguagens e Cףdigos
        "MT"    Matemבtica
/TP_LINGUA
        0   Inglךs
        1   Espanhol
/IN_ITEM_ADAPTADO
        0   Nדo
        1   Sim.

您可以看到它们描述了每一列的元数据。

2 个答案:

答案 0 :(得分:2)

.sas是SAS的program file extension,旨在通过SAS使用。本质上,它是一个用作字典文件的命令文件。

.sps是SPSS的程序文件扩展名,旨在通过SPSS使用。它实质上是一个用作字典文件的命令文件。我在这里也提供了一个方便的链接,但是SPSS是IBM产品,其文档是一种让人难以承受的恶梦。

尽管如此,您尝试做的事情还是应该可能的。熊猫本身是不够的,因为它没有内置功能来解决这些情况。 Pandas对SAS的支持仅扩展到.sas7bdat数据文件,而对SPSS的支持仅扩展到.sav数据文件。

Python(和Pandas)可以读取.sas和.sps扩展名,因为它们是纯文本文件,但实际上无法对其进行任何处理。


这里有两条途径让您获得想要的东西。

1)在试用版上安装SAS或SPSS,使用它读取数据,然后以其他格式导出。

2)安装并尝试对Pandas使用pyreadstat扩展名。

听起来熊猫框架是您的首选,而要使其正常工作,您需要扩展它的功能。在这种情况下,请使用pyreadstat扩展名。它旨在与SAS和SPSS数据文件一起使用,并处理它们的效率远高于熊猫本身。此解决方案附带警告。

Pyreadstat本身是ReadStat的转换。引用pyreadstat自述文件:

This module is a wrapper around the excellent Readstat C library by Evan Miller. 
Readstat is the library used in the back of the R library Haven, 
meaning pyreadstat is a python equivalent to R Haven.

如果仅查看pyreadstat文件,通常不会发现任何与.sas或.sps或字典文件有关的内容。相反,您需要查看here中的ReadStat的自述文件。它的一节专门介绍了这种情况。

到目前为止,我还没有测试pyreadstat中针对字典文件存在的ReadStat命令和功能,因此有可能无法正常工作。

如果您尝试此解决方案但对您而言失败,请继续执行该线程,我将帮助您进行故障排除。

答案 1 :(得分:0)

干净的方法是将SAS数据导出为XPORT或SAS7BDAT格式的文件。

之后,您可以使用熊猫函数pandas.read_sas

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sas.html

    将numpy导入为np     将熊猫作为pd导入

df = pd.read_sas('test.sas7bdat')

如果文件很大,则可以使用chunksize参数来一次仅读取x个文件行,并返回迭代器。或者,您可以使用iterator参数 为了返回一个迭代器,以递增方式读取文件。