在 SPSS 中打开、重新编码和堆叠多个 .csv 文件的宏

Macro to open, recode and stack several .csv files in SPSS

我正在尝试编写一个宏:

  1. 将多个 .csv 顺序文件中的 yearmonthidvaluemotive 列导入到 SPSS .这些文件的命名方式如下:DATA_JAN_2010DATA_FEB_2010 [...],直到 DATA_DEC_2019。这些是 csv 文件的第一个变量(最后提供了我用来导入这些变量的代码)。

  2. 如有必要,将列类型 id 更改为 (a11),将 motive 更改为 (a32)(需要堆叠所有文件)。

  3. 将所有这些数据集堆叠在一个名为:DATA_2010_2019.

    的新数据集中

目前我做的是分别导入每个文件,两个两个堆叠保存。但从效率的角度来看,这是如此重复和不合理。此外,如果将来我需要导入额外的变量,我将需要为每个文件重写所有代码。这就是为什么我相信循环或宏是处理这些重复代码的最聪明的方法。非常感谢任何帮助。

到目前为止我的代码示例:

GET DATA  /TYPE=TXT
  /FILE="C:\Users\luizz\DATA\DATA_JAN_2010.csv"
  /ENCODING='Locale'
  /DELCASE=LINE
  /DELIMITERS=";"
  /ARRANGEMENT=DELIMITED
  /FIRSTCASE=2
  /IMPORTCASE=ALL
  /VARIABLES=
  YEAR F4.0
  MONTH F1.0
  ID A11
  VALUE F4.0
  MOTIVE A8.
CACHE.
EXECUTE.
DATASET NAME JAN_2010 WINDOW=FRONT.

ALTER TYPE MOTIVE (a32).

GET DATA  /TYPE=TXT
  /FILE="C:\Users\luizz\DATA\DATA_FEB_2010.csv"
  /ENCODING='Locale'
  /DELCASE=LINE
  /DELIMITERS=";"
  /ARRANGEMENT=DELIMITED
  /FIRSTCASE=2
  /IMPORTCASE=ALL
  /VARIABLES=
  YEAR F4.0
  MONTH F1.0
  ID A11
  VALUE F4.0
  MOTIVE A8.
CACHE.
EXECUTE.
DATASET NAME FEB_2010 WINDOW=FRONT.

DATASET ACTIVATE FEB_2010.
ALTER TYPE MOTIVE (a32).

DATASET ACTIVATE JAN_2010.
ADD FILES /FILE=*
  /FILE='FEB_2010'.
EXECUTE.

SAVE OUTFILE='C:\Users\luizz\DATA\DATA_JAN_FEV_2010.sav'
  /COMPRESSED.

假设所有文件的参数都相同,您可以使用这样的宏:

define !getfiles ()
!do !yr=2010 !to 2019
!do !mn !in("JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC")
GET DATA 
  /TYPE=TXT /FILE=!concat('"C:\Users\luizz\DATA\DATA_', !mn, '_', !yr, '.csv"')
  /ENCODING='Locale'   /DELCASE=LINE   /DELIMITERS=";"   /ARRANGEMENT=DELIMITED
  /FIRSTCASE=2   /IMPORTCASE=ALL   /VARIABLES= 
  YEAR F4.0
  MONTH F1.0
  ID A11
  VALUE F4.0
  MOTIVE A8.
CACHE.
EXECUTE.
ALTER TYPE id (a11) MOTIVE (a32).
dataset name tmp.
dataset activate gen.
add files /file=* /file=tmp.
exe.
!doend !doend
!enddefine.

定义的宏将读取每个文件并将其添加到主文件中。在调用宏之前,我们将创建主文件:

data list list/YEAR (F4)  MONTH (F1) ID (A11) VALUE (F4) MOTIVE (A8).
begin data
end data.
exe.
dataset name gen.
* now we can call the macro.
!getfiles .
* now the data is all combined and we can save it.
SAVE OUTFILE='C:\Users\luizz\DATA\DATA_JAN_FEV_2010.sav'  /COMPRESSED.

注意:我在宏中使用了原始 post 中的代码。请确保所有的定义都是正确的。