将 SAS 表导出到 Excel 电子表格中的列格式
Posted
技术标签:
【中文标题】将 SAS 表导出到 Excel 电子表格中的列格式【英文标题】:Formatting columns in exporting SAS table to Excel spreadsheet 【发布时间】:2013-08-06 22:35:36 【问题描述】:我正在使用 ODS ExcelXP
自动将数据集从 SAS 导出到 Excel:
PURCHASE_ annual_ Minimum_
Obs APR fee Cash_Advance
1 23.45% NONE $10
2 23.45% NONE $10
3 23.45% NONE $10
4 18.45% NONE $10
5 18.45% NONE $10
6 18.45% NONE $10
7 23.45% NONE $10
8 23.45% NONE $10
9 23.45% NONE $10
10 23.45% $0
11 23.45% $0
12 23.45% $0
在 SAS 中,列被格式化为文本,我希望将所有列作为文本导入 Excel。我使用以下代码使用PROC REPORT
创建文件:
ods tagsets.ExcelXP path="H:/path" file="file.xls" style=myStyle
options(frozen_headers='yes' WrapText='no'
embedded_titles='yes' suppress_bylines='yes'
sheet_interval='none' sheet_label=' '
sheet_name='Solicited'
width_points='1' width_fudge='1'
absolute_column_width='100' autofit_height='yes'
zoom='100');
title1;
proc report data=testing2 nowd;
column purchase_APR annual_fee minimum_cash_advance;
define purchase_APR / display style(column)=tagattr='format:@' 'PURCHASE_APR';
define annual_fee / display style(column)=tagattr='format:@' 'ANNUAL_FEE';
define minimum_cash_advance / display style(column)=tagattr='format:@' 'MINIMUM_CASH_ADVANCE';
run;
ods tagsets.ExcelXP close;
但是,当打开 Excel 文件时,文本字段已从 23.45%
、$0
和 $10
(文本)更改为 0.2345
、0
和 10
(文本) 分别。
如何让 Excel 中的输出与 SAS 中的数据集一样?
我尝试使用特定格式让它们看起来相同(即tagattr='format:0.00%'
等),但 Excel 中的输出是数字而不是文本格式。
【问题讨论】:
【参考方案1】:正确的方法是修改模板处理数字的方式。在这种情况下,你可以很容易地做到这一点。您甚至可以只注释掉一行代码和一段代码,但这是真正正确的答案。
在文本编辑器中打开template。我们将添加几个参数并实现它们。
首先,将选项添加到 $valid_options 数组。有一堆这样的行,再加上这两行(大约635行左右):
set $valid_options["TEXTPERCENT"] "This value forces percentages to be displayed as text";
set $valid_options["TEXTCURRENCY"] "This value forces currency amounts to be displayed as text";
该文本可以是您想要的任何内容,这是一种解释。现在,在第 700 行附近有一些设置默认值的行,添加这两个:
set $option_defaults["TEXTCURRENCY"] 'no';
set $option_defaults["TEXTPERCENT"] 'no';
现在很晚了(大约第 1670 行),您有了定义 $punctuation 的部分。如果您设置了这些选项,我们会更改其工作方式,以便从列表中删除“%”和“$”:
set $punctuation $thousands_separator " ";
set $punctuation $punctuation "%" /if ^$textpct;
set $punctuation $punctuation $currency_sym /if ^$textcurr;
(基本上,设置 $variable /if ;我们设置标点符号以 $thousands_separator 开头,然后添加其他位,如果它们只是“否”。)
现在在“是/否开/关选项...”部分的第 2100 行附近,我们评估选项的值。 (先验使用这些值,但没关系;实际上是稍后调用的。)
set $option_key 'TEXTPERCENT';
trigger do_yes_no;
eval $textpct $answer;
set $option_key 'TEXTCURRENCY';
trigger do_yes_no;
eval $textcurr $answer;
最后,我们实现了一些东西。在第 7400 行附近是event value_type;
,这是删除 % $ 并且数字被调整为“实数”的地方,即使它们不应该是。这很烦人。所以我们告诉它不要这样做。
do /if ^$textpct;
do /if $convert_percentages;
eval $tmp inputn($value, $test_format)/100;
else;
eval $tmp inputn($value, $test_format);
done;
/*putlog "Percent value:" $tmp;*/
set $value $tmp;
done;
我们用do /if ^$textpct;
和done
包装百分比转换代码,告诉它跳过输入n(这将杀死我们的百分比)。如果我们在作弊并且没有以正确的方式这样做,我们可以注释掉这一行:
set $value compress($value, $punctuation);
但由于我们已将 $punctuation 变量固定为包含(或不包含!)正确的内容,所以这不是问题。
现在这将起作用!我们只是修改标签集调用:
*First include your tagset, which I put in c:\temp\ but you can put wherever and call whatever you like;
%include "c:\temp\excel_tpl_nocompress.txt";
ods tagsets.ExcelXP path="c:\temp\" file="testfile.xml"
options(frozen_headers='yes' WrapText='no'
embedded_titles='yes' suppress_bylines='yes'
sheet_interval='none' sheet_label=' '
sheet_name='Solicited' convert_percentages="no"
width_points='1' width_fudge='1'
absolute_column_width='100' autofit_height='yes'
textcurrency='yes' textpercent='yes'
zoom='100');
title1;
*Then add in the textpercent and textcurrency lines, and it should work as is.;
现在你要去参加比赛了。
- <Row ss:AutoFitHeight="1">
- <Cell ss:StyleID="data__l1" ss:Index="1"> <Data ss:Type="String">23.45%</Data> </Cell>
- <Cell ss:StyleID="data__c1" ss:Index="2"> <Data ss:Type="String" /> </Cell>
- <Cell ss:StyleID="data__l1" ss:Index="3"> <Data ss:Type="String">$0</Data> </Cell>
</Row>
【讨论】:
我实际上已经尝试添加单引号,在 Excel 中我得到的是 '$0 而不是 $0。还有其他想法吗?我可以让它们看起来像我想要的那样,但它们是 Excel 中的数字字段。我希望它们成为 Excel 中的文本字段。 谢谢乔!我找到了正确的 SAS 选项,让它误以为我的货币和十进制符号是管道而不是“$”和“。”知道我也可以直接查看生成的 xml 以进行故障排除很有用。 @MarkNielsen 更新了“正确”的方法,当然你的 hack 也是一个很好的解决方案。 做到了!我确保将它们格式化为TAGATTR
中的文本,并且效果很好!谢谢!
另外,只有一个错字,设置$punctuation $puntuation "%" /if ^$textpct;
应该是set $punctuation $punctuation "%" /if ^$textpct;
【参考方案2】:
我找到了我需要的答案。我在以下页面上找到了 ExcelXP 选项:ExcelXP Options 我知道这是一个“黑客”,但我将tagsets.ExcelXP
中的默认选项更改为currency_symbol = "|"
和decimal_separator = "|"
...愚弄SAS 认为它应该寻找货币的管道而不是美元符号和管道而不是百分比的句点。这样,当遇到 $0
或 23.45%
时,它会将这些视为纯文本。
【讨论】:
以上是关于将 SAS 表导出到 Excel 电子表格中的列格式的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从Excel电子表格导出到Sql Server 2008表