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

Loops 宏以在SPSS中打开、重新编码和堆叠多个.csv文件,loops,macros,spss,Loops,Macros,Spss,我正在尝试编写一个宏: 将多个.csv顺序文件中的年、月、id、值和动机列导入SPSS。这些文件的名称如下:DATA\u JAN\u 2010,DATA\u FEB\u 2010[…],直到DATA\u DEC\u 2019。这些是csv文件的第一个变量(最后提供了我用来导入这些变量的代码) 如有必要(需要堆叠所有文件),将列的类型id更改为(a11),motive更改为(a32) 将所有这些数据集堆叠在名为:DATA\u 2010\u 2019的新数据集中 现在,我要做的是分别导入每个文

我正在尝试编写一个宏:

  • 将多个.csv顺序文件中的
    id
    动机
    列导入SPSS。这些文件的名称如下:
    DATA\u JAN\u 2010
    DATA\u FEB\u 2010
    […],直到
    DATA\u DEC\u 2019
    。这些是csv文件的第一个变量(最后提供了我用来导入这些变量的代码)

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

  • 将所有这些数据集堆叠在名为:
    DATA\u 2010\u 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.
    

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

    Hi@eli-k,非常感谢您的代码!我在运行它时出错了。“未知数据集生成。此命令的执行停止。”。但后来我想了一会儿,我明白了。创建主文件后,您忘记写入“dataset name gen.”。然后它运行顺利!!!谢谢我不知道如何在SPSS上编写宏。你的更正是完全正确的。很高兴有帮助!