在 SPSS 中打开、重新编码和堆叠多个 .csv 文件的宏
Macro to open, recode and stack several .csv files in SPSS
我正在尝试编写一个宏:
将多个 .csv 顺序文件中的 year
、month
、id
、value
和 motive
列导入到 SPSS .这些文件的命名方式如下:DATA_JAN_2010
、DATA_FEB_2010
[...],直到 DATA_DEC_2019
。这些是 csv 文件的第一个变量(最后提供了我用来导入这些变量的代码)。
如有必要,将列类型 id
更改为 (a11)
,将 motive
更改为 (a32)
(需要堆叠所有文件)。
将所有这些数据集堆叠在一个名为: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 中的代码。请确保所有的定义都是正确的。
我正在尝试编写一个宏:
将多个 .csv 顺序文件中的
year
、month
、id
、value
和motive
列导入到 SPSS .这些文件的命名方式如下:DATA_JAN_2010
、DATA_FEB_2010
[...],直到DATA_DEC_2019
。这些是 csv 文件的第一个变量(最后提供了我用来导入这些变量的代码)。如有必要,将列类型
id
更改为(a11)
,将motive
更改为(a32)
(需要堆叠所有文件)。将所有这些数据集堆叠在一个名为:
的新数据集中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 中的代码。请确保所有的定义都是正确的。