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



我正在尝试编写一个宏,该宏:

  1. 将列yearmonthidvaluemotive从几个.csv序列文件导入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:UsersluizzDATADATA_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:UsersluizzDATADATA_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:UsersluizzDATADATA_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:UsersluizzDATADATA_', !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:UsersluizzDATADATA_JAN_FEV_2010.sav'  /COMPRESSED.

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

最新更新