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

nev*_*ves 7 python sas spss 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;
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到等效的.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.
Run Code Online (Sandbox Code Playgroud)

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

Ren*_* B. 0

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

之后你可以使用 pandas 函数pandas.read_sas

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

导入 numpy as np 导入 pandas as pd

df = pd.read_sas('test.sas7bdat')
Run Code Online (Sandbox Code Playgroud)

如果您有大文件,则可以使用chunksize一次仅读取 x 文件行的参数,返回迭代器。或者您可以使用iterator参数来返回迭代器以增量读取文件。