格式化导出SAS表格到Excel电子表格中的列
我使用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中,这些列被格式化为文本,我希望所有的列都以文本forms导入到Excel中。 我已经使用下面的代码来使用PROC REPORT
来创build文件:
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
和10
(文本)。
我怎样才能在Excel中获得输出就像在SAS中设置的数据?
我已经尝试使用特定的格式,让他们看起来相同(即tagattr='format:0.00%'
等),但在Excel中的输出是数字,而不是文本格式。
正确的方法是修改模板如何处理数字。 在这种情况下,你可以很容易地做到这一点。 你甚至可以只是注释掉一行代码,但是这里是真正的答案。
在文本编辑器中打开模板 。 我们将添加几个参数,并实现它们。
首先,将选项添加到$ 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行左右),你有定义$标点符号的部分。 如果您设置了以下选项,我们将更改工作方式以从列表中删除“%”和“$”:
set $punctuation $thousands_separator " "; set $punctuation $punctuation "%" /if ^$textpct; set $punctuation $punctuation $currency_sym /if ^$textcurr;
(基本上,设置$ variable / if;我们设置标点符号以$ thousand_separator开始,如果它们是“no”,则添加其他位)。
现在在“是/否开/关选项…”部分的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;
包装百分比转换代码do /if ^$textpct;
并done
,它告诉它跳过inputn(这将杀死我们的百分比)。 如果我们在作弊,而没有按照正确的方式来做,我们可以注释掉这一行:
set $value compress($value, $punctuation);
但是,由于我们已经修正了$标点符号variables来包含(或不包含!)正确的东西,这不是一个问题。
现在这将工作! 我们只是修改tagset调用:
*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>
我find了我需要的答案。 我在下面的页面find了ExcelXP选项: ExcelXP选项我知道这是一个'黑客',但我改变了tagsets.ExcelXP
的默认选项是currency_symbol = "|"
和decimal_separator = "|"
…欺骗SAS认为它应该寻找货币pipe道,而不是美元符号和pipe道,而不是一个百分比的时间段。 这样,当它遇到$0
或23.45%
它把它们当作纯文本。