如何从宏中为Stata中的变量赋予标签

时间:2013-01-23 16:56:34

标签: c++ plugins label stata

我想用插件创建变量,导入数据库表。 我使用以下代码执行此操作:

  

SF_macro_save(“_ vars”,“var1 var2 ...”);
  SF_macro_save(“_ types”,“type1 type2 ...”);
  SF_macro_save(“_ formats”,“format1 format2 ...”);
  SF_macro_save(“_ obs”,“obs1 obs2 ......”);

这样可以很好地创建变量,但我不知道如何为变量或值赋予标签。

我需要使用哪种C ++函数来创建标签?或者我如何从C ++调用Stata函数? (如果重要的话,我使用的是Visual Studio 10)

我想从插件中调用这个Stata函数:

  

标签变量var1 label1

  

标签定义var1_label 1“label1”2“label2”   标签值var1 var1_label

由于

2 个答案:

答案 0 :(得分:1)

这是可能的,但这并不容易。基本上,您在代码中创建.do文件(下面的C#示例)然后执行.do文件。下面是一个运行.do文件然后使用ODBC将结果放入SQL Server数据库的示例。您可以使用Stat / Transfer执行类似操作,将数据和变量标签加载到数据库中。

            string m_stcmd_valuelabels = Server.MapPath("~/Data/Cmd/Stata/") + m_filename_noex + "_valuelables.do";

            using (StreamWriter m_sw_stcmd_valuelabels = new StreamWriter(m_stcmd_valuelabels, false))
            {

                m_sw_stcmd_valuelabels.WriteLine("clear");
                m_sw_stcmd_valuelabels.WriteLine("set mem 500m");
                m_sw_stcmd_valuelabels.WriteLine("set more off");
                m_sw_stcmd_valuelabels.WriteLine("use  \"" + m_fullpath.Replace(".zip", ".dta") + "\"");
                m_sw_stcmd_valuelabels.WriteLine("valtovar _all, dis");
                m_sw_stcmd_valuelabels.WriteLine("uselabel");
                m_sw_stcmd_valuelabels.WriteLine("ren lname varname");
                m_sw_stcmd_valuelabels.WriteLine("drop trunc");
                m_sw_stcmd_valuelabels.WriteLine("odbc insert, dsn(\"MyData\") table(\"" + m_filename_noex + "_valuelabels\") create " + m_statadsn_conn);
                m_sw_stcmd_valuelabels.WriteLine("exit");
                m_sw_stcmd_valuelabels.WriteLine();
            }

            string str_PathValueLabels = Server.MapPath("~/Data/Stata12/StataMP-64.exe");

            ProcessStartInfo processInfoValueLabels = new ProcessStartInfo("\"" + str_PathValueLabels + "\"");
            processInfoValueLabels.Arguments = " /e do \"" + m_stcmd_valuelabels + "\"";
            processInfoValueLabels.UseShellExecute = false;
            processInfoValueLabels.ErrorDialog = false;

            Process batchProcessValueLabels = new Process();
            batchProcessValueLabels.StartInfo = processInfoValueLabels;
            batchProcessValueLabels.Start();

答案 1 :(得分:0)

你不能从插件中做到这一点。您无法创建变量,标签。从您的dll开始,必须在调用插件之前定义数据集,您可能已经知道了。您可以将数据值存储回变量中,但如果愿意,则不会添加“列”。您可以在宏中存储所需的名称,但它会落在您的“.do”文件中,以便将它们分配给Stata中的变量,抱歉。