SPSS宏开发需求:批量导入、转换并合并多份CSV文件
用SPSS宏批量导入并合并月度CSV数据集
完全理解你的痛点——手动逐个导入合并不仅繁琐,后续修改变量还要重复改一堆代码,用宏来处理这类重复操作确实是最优解。下面我给你写一个通用的SPSS宏,能自动遍历2010到2019年的所有月度CSV文件,统一变量类型后合并成一个完整的数据集,以后要新增变量或者调整年份范围,只需要改几行参数就行。
完整宏代码
DEFINE !BatchImportMerge ( Path = !TOKENS(1) , StartYear = !TOKENS(1) , EndYear = !TOKENS(1) , OutFile = !TOKENS(1) ) * 定义月份缩写列表,对应文件名里的JAN/FEB...DEC. !LET !Months = !QUOTE("JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC") !LET !MonthList = !SUBST(!Months, ",", " ") * 初始化主数据集(先导入第一个文件作为基础). !LET !FirstYear = !StartYear !LET !FirstMonth = !HEAD(!MonthList, 1) GET DATA /TYPE=TXT /FILE=!CONCAT(!Path, "\DATA_", !FirstMonth, "_", !FirstYear, ".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 A32. DATASET NAME MainData WINDOW=FRONT. * 循环遍历剩余的年份和月份. !DO !Y = !StartYear !TO !EndYear !DO !M !IN !MonthList * 跳过已经作为基础的第一个文件. !IF (!Y = !FirstYear & !M = !FirstMonth) !THEN !CONTINUE !IFEND * 导入当前月度文件. GET DATA /TYPE=TXT /FILE=!CONCAT(!Path, "\DATA_", !M, "_", !Y, ".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 A32. DATASET NAME TempData WINDOW=FRONT. * 追加到主数据集. DATASET ACTIVATE MainData. ADD FILES /FILE=* /FILE=TempData. EXECUTE. * 删除临时数据集. DATASET CLOSE TempData. !DOEND !DOEND * 保存合并后的最终数据集. SAVE OUTFILE=!OutFile /COMPRESSED. DATASET CLOSE MainData. !ENDDEFINE. * 调用宏,替换成你的实际路径和参数. !BatchImportMerge Path="C:\Users\luizz\DATA" StartYear=2010 EndYear=2019 OutFile="C:\Users\luizz\DATA\DATA_2010_2019.sav"
代码关键说明
- 宏参数化:开头的
!BatchImportMerge宏定义了4个参数,方便你后续修改文件路径、年份范围和输出文件名,不用改宏内部的核心逻辑。 - 统一变量类型:直接在
GET DATA里把ID设为A11、MOTIVE设为A32,省去了后续ALTER TYPE的步骤,确保所有文件的变量类型完全一致,避免合并时出现类型不匹配的问题。 - 循环遍历:用两层
!DO循环分别遍历年份和月份,自动生成每个CSV的文件名,不用手动写每个文件的导入代码。 - 高效合并:初始创建主数据集后,每次导入的临时数据直接追加进去,最后一次性保存,比你之前两两合并的方式效率高很多。
使用和维护技巧
- 调用宏时,只需要修改最后几行的参数值,替换成你的实际文件路径和需求即可。
- 如果以后需要新增导入变量,只需要在宏里的
/VARIABLES=部分添加对应的变量定义,所有文件都会自动应用这个修改,不用逐个调整。 - 如果需要扩展年份范围,比如到2020年,只需要把
EndYear=2019改成EndYear=2020就行。
内容的提问来源于stack exchange,提问作者LuizZ
相关产品推荐
相关产品推荐

