1

我是 SPSS 宏的新手,并试图从变量中的指定路径打开 CSV 文件。

请注意,我想在文件顶部设置所有变量设置,因此我可以轻松决定导入另一个具有不同名称的文件。

这是我的代码:

/* settings */
define !SYMB() "VIX". !enddefine.
define !CSVFILE() "E:\Downloads\$" + !SYMB + ".csv". !enddefine.

/* import csv file */
GET DATA
  /TYPE=TXT
  /FILE=!CSVFILE
  /DELCASE=LINE
  /DELIMITERS=","
  /ARRANGEMENT=DELIMITED
  /FIRSTCASE=1
  /IMPORTCASE=ALL
  /VARIABLES=
  V1 5X
  Date ADATE10
  !SYMB + 'O' F7.2
  !SYMB + 'H' F7.2
  !SYMB + 'L' F7.2
  !SYMB + 'C' F7.2.
CACHE.
EXECUTE.
DATASET NAME "DataSet" + !SYMB WINDOW=FRONT.

不幸的是,我收到以下错误:

/* 设置 */ 定义 !SYMB() "VIX"。!结束定义。定义 !CSVFILE() "E:\Downloads\$" + !SYMB + ".csv"。!结束定义。

第 13 列中的警告 #207。文本:E:\Downloads\$ 在文本字符串之后发现一个“+”,表示继续,但下一个非空白字符不是引号或撇号。

/* 导入 csv 文件 */ GET DATA /TYPE=TXT /FILE=!CSVFILE

错误。命令名称:GET DATA (2256) 无效的子命令:FILE 此命令的执行停止。

错误 # 1. 命令名称:+ 行中的第一个单词未被识别为 SPSS Statistics 命令。该命令的执行停止。/DELCASE=LINE

错误 # 1. 命令名称:/DELCASE 行中的第一个单词未被识别为 SPSS Statistics 命令。该命令的执行停止。/DELIMITERS="," /ARRANGEMENT=DELIMITED /FIRSTCASE=1 /IMPORTCASE=ALL /VARIABLES= V1 5X 日期 ADATE10 !SYMB + 'O' F7.2

错误 # 1. 命令名称:+ 行中的第一个单词未被识别为 SPSS Statistics 命令。该命令的执行停止。!SYMB + 'H' F7.2

错误 # 1. 命令名称:+ 行中的第一个单词未被识别为 SPSS Statistics 命令。该命令的执行停止。!SYMB + 'L' F7.2

错误 # 1. 命令名称:+ 行中的第一个单词未被识别为 SPSS Statistics 命令。该命令的执行停止。!SYMB + 'C' F7.2。

错误 # 1. 命令名称:+ 行中的第一个单词未被识别为 SPSS Statistics 命令。该命令的执行停止。缓存。执行。

错误 # 105。命令名称:EXECUTE 此命令在定义工作文件之前无效。该命令的执行停止。数据集名称“数据集”+!SYMB WINDOW=FRONT。

我应该怎么做?

建议宏的输出

/* settings */
define !SYMB() "VIX" !enddefine.
define !CSVFILE() !quo(!con("E:\Downloads\$", !unq(!eva(!SYMB)), ".csv")) !enddefine.
define !c(str1 = !tok(1) /str2 = !tok(1)) !con(!unq(str1), !unq(str2)) !end.
define !cq(str1 = !tok(1) /str2 = !tok(1)) !quo(!con(!unq(str1), !unq(str2))) !end.

/* import csv file */
GET DATA
  /TYPE=TXT
  /FILE=!CSVFILE /DELCASE=LINE
  /DELIMITERS=","
  /ARRANGEMENT=DELIMITED
  /FIRSTCASE=1
  /IMPORTCASE=ALL
  /VARIABLES=
  V1 5X
  Date ADATE10
  !c !str1=!SYMB str2="O" F7.2

>Warning # 210 in column 2.  Text: !str1
>A macro symbol is invalid in this context.
>The symbol will be treated as an invalid special character.
  !c !str1=!SYMB str2="H" F7.2

>Warning # 210 in column 2.  Text: !str1
>A macro symbol is invalid in this context.
>The symbol will be treated as an invalid special character.
  !c !str1=!SYMB str2="L" F7.2

>Warning # 210 in column 2.  Text: !str1
>A macro symbol is invalid in this context.
>The symbol will be treated as an invalid special character.
  !c !str1=!SYMB str2="C" F7.2.

>Warning # 210 in column 2.  Text: !str1
>A macro symbol is invalid in this context.
>The symbol will be treated as an invalid special character.

>Error.  Command name: GET DATA
>(2265) Unrecognized or invalid variable format.  The format is invalid.  For
>numeric formats, the width or decimals value may be invalid.
>Execution of this command stops.
CACHE.
EXECUTE.

>Error # 105.  Command name: EXECUTE
>This command is not valid before a working file has been defined.
>Execution of this command stops.
DATASET NAME !cq !str1="DataSet" !str2=!SYMB WINDOW=FRONT.

测试输出:

set err=off.
set mpr=on.
set printback=on.
  11  0 M>  set printback=on.

  12  0 M>  
!c str1="A" str2="B".
  13  0 M>  !c str1="A" str2="B".
!cq str1="A" str2="B".
  14  0 M>  !cq str1="A" str2="B".

  15  0 M>  
set printback=off.
  16  0 M>  set printback=off.
4

2 回答 2

2

SPSS 宏语言很棘手。

1)您必须在宏内连接字符串;

2)避免宏命令中的点 - 如果它们不是必需的;

3) 不要以宏命令结束行。

试试这个未经测试的语法:

/* settings */
define !SYMB() "VIX" !enddefine.
define !CSVFILE() !quo(!con("E:\Downloads\$", !unq(!eva(!SYMB)), ".csv")) !enddefine.
define !c(str1 = !tok(1) /str2 = !tok(1)) !con(!unq(!str1), !unq(!str2)) !end.
define !cq(str1 = !tok(1) /str2 = !tok(1)) !quo(!con(!unq(!str1), !unq(!str2))) !end.

/* import csv file */
GET DATA
  /TYPE=TXT
  /FILE=!CSVFILE /DELCASE=LINE
  /DELIMITERS=","
  /ARRANGEMENT=DELIMITED
  /FIRSTCASE=1
  /IMPORTCASE=ALL
  /VARIABLES=
    V1 5X
    Date ADATE10
    !c str1=!SYMB str2="O" F7.2
    !c str1=!SYMB str2="H" F7.2
    !c str1=!SYMB str2="L" F7.2
    !c str1=!SYMB str2="C" F7.2.

EXECUTE.

DATASET NAME !cq str1="DataSet" str2=!SYMB WINDOW=FRONT.

你能否运行这个测试语法并将你得到的结果发布到输出中。

set err=off.
set mpr=on.
set printback=on.

!c str1="A" str2="B".
!cq str1="A" str2="B".

set printback=off.
set mpr=off.
set err=on.
于 2012-01-08T22:06:01.930 回答
0

宏确实很棘手。出于您的目的,我建议您使用更简单的 FILE HANDLE 命令来定义您的输入。您可以在从帮助菜单访问的语法参考手册中阅读有关它的信息。

HTH,乔恩·派克

于 2012-01-09T12:57:57.843 回答