首页 > 解决方案 > 如何使用 .SAS 或 SPS 元数据文件将 CSV 读取为 Pandas 数据框?

问题描述

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

如何使用这些元数据文件来帮助我阅读 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.

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

标签: pythonpandassasspss

解决方案


.sas 是 SAS 的程序文件扩展名,旨在通过 SAS 使用。它本质上是一个用作字典文件的命令文件。

.sps 是 SPSS 的程序文件扩展名,旨在通过 SPSS 使用。它本质上是一个用作字典文件的命令文件。我也会在这里提供一个方便的链接,但 SPSS 是 IBM 产品,他们的文档是一个地狱般的风景,任何人都不应该涉足。

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

Python(和 Pandas)可以读取 .sas 和 .sps 扩展名,因为它们是纯文本文件,但实际上不能对它们做任何事情。


您可以通过以下两条途径获得您所追求的东西。

1) 在试用版上安装 SAS 或 SPSS,用它来读取数据,然后以另一种格式导出。

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

听起来 pandas 框架是您的偏好,要使其工作,您需要扩展它的功能。在这种情况下,使用pyreadstat扩展。它旨在处理 SAS 和 SPSS 数据文件,并且比 pandas 本身处理它们的效率要高得多。此解决方案附带一个警告。

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 或字典文件的内容。相反,您需要查看此处找到的 ReadStat 的自述文件。它有一节专门涵盖此类情况。

到目前为止,我还没有测试 pyreadstat 中字典文件存在的 ReadStat 命令和函数,所以这有可能不起作用。

如果您尝试此解决方案但它失败了,请跟进该线程,我将帮助您进行故障排除。


推荐阅读