0

我确定这是简单的 SQL,但我有一个表,其中包含每个 X(当前为 3)级别的多条记录。我基本上想将其复制到 csv 文件中,每个级别一个。

我有选择的 SQL,我可以把它复制出来。我还可以进行选择以获取文件中唯一级别的列表。我不能工作的是如何让 foxpro 循环遍历唯一级别并提供文件名并仅保存相关记录。

我正在使用扫描来遍历唯一记录,但显然我正在做的事情是错误的。

* identify the different LPG report levels
SELECT STREXTRACT(ALLTRIM(group),"|","|",3) as LPG_level FROM &lcFile GROUP BY LPG_level INTO CURSOR levels

TEXT to lcSql1 noshow textmerge pretext 15
   SELECT 
         LEFT(ALLTRIM(group),ATC("|",ALLTRIM(group))-1) as Sim, 
         STREXTRACT(ALLTRIM(group),"|","|",1) as Company, 
ENDTEXT

TEXT to lcSql2 noshow textmerge pretext 15
         time, 
         SUM(as) as Asset_Share_Stressed,
         SUM(as_us) as Asset_Share_Unstressed 
      FROM <<lcFile>> 
      GROUP BY Sim, 
         Company, 
         Fund, 
         LPG_level,
         Output_group, 
         time 
      ORDER BY sim asc,
            output_group asc
      INTO CURSOR bob
ENDTEXT


TEXT to lcSqlgroup2 noshow textmerge pretext 15    
     RIGHT(ALLTRIM(group),LEN(ALLTRIM(group)) - ATC("|",ALLTRIM(group),4)) as Output_group, 
ENDTEXT

    TEXT to lcSql_fund2 noshow textmerge pretext 15
        STREXTRACT(ALLTRIM(group),"|","|",2) as Fund, 
    ENDTEXT

    TEXT to lcSql_level noshow textmerge pretext 15
        STREXTRACT(ALLTRIM(group),"|","|",3) as LPG_level, 
    ENDTEXT

    &lcSql1 + &lcSql_fund2 + &lcSql_level + &lcSqlgroup2 + &lcSql2

    SELECT levels
    SCAN
        COPY TO output_path + lcFilename + levels.LPG_level for bob.LPG_Level = levels.LPG_Level

    endscan
4

3 回答 3

0

感谢所有的帮助。当我重用代码块时,我在此处另一个问题的某人的建议中使用了 text/endtext 的东西,但现在 TBH 有点矫枉过正,所以我可能会在某个时候清理它。

我确实从团队中了解一些 SQL 的其他人那里得到了一些帮助,但该解决方案看起来与 DRapp 的非常相似。

粘贴在下面作为下次提醒或帮助其他人。

FOR i=1 TO lnCnt
lcFile = LOWER(output_path + laFiles[i,1])
lcFilename = LEFT(laFiles[i,1],ATC("~main4",laFiles[i,1])-1)

IF file(lcFile) = .F. then
    ERROR "File " + lcFile + " does not exist"
ENDIF

* Status window, tell user which file being processed
WAIT WINDOW (lcFile + ". File: " + ALLTRIM(STR(i)) + " of " + ALLTRIM(STR(lnCnt))) nowait

* identify the different LPG report levels
SELECT STREXTRACT(ALLTRIM(group),"|","|",3) as LPG_level FROM &lcFile GROUP BY LPG_level INTO CURSOR levels

* Build up the select string, starting with the sim number and company
TEXT to lcSql1 noshow textmerge pretext 15
   SELECT 
         LEFT(ALLTRIM(group),ATC("|",ALLTRIM(group))-1) as Sim, 
         STREXTRACT(ALLTRIM(group),"|","|",1) as Company, 
ENDTEXT

* Add the fund
TEXT to lcSql_fund2 noshow textmerge pretext 15
    STREXTRACT(ALLTRIM(group),"|","|",2) as Fund, 
ENDTEXT

* Add the Output group
TEXT to lcSqlgroup2 noshow textmerge pretext 15    
     RIGHT(ALLTRIM(group),LEN(ALLTRIM(group)) - ATC("|",ALLTRIM(group),4)) as Output_group, 
ENDTEXT

* Not actually required but helps clarify the output groups, the report level (e.g. tax-status, LoB, vclass)
TEXT to lcSql_level noshow textmerge pretext 15
    STREXTRACT(ALLTRIM(group),"|","|",3) as LPG_level, 
ENDTEXT

* Add the rest of the select, with the fields and their output names, the fields to group on and the sort order 
TEXT to lcSql2 noshow textmerge pretext 15
         time, 
         SUM(as) as Asset_Share_Stressed,
         SUM(as_us) as Asset_Share_Unstressed, 
         SUM(cogao) as CoGAO, 
         SUM(cog) as CoG, 
         SUM(cope) as CoPE, 
         SUM(cos) as CoS, 
         SUM(cope_wluk) as CoPE_WLUK, 
         SUM(copd_gteed) as CoPD_Gteed, 
         SUM(copd_other) as CoPD_Other,
         SUM(fprl_resid) as FPRL_resid,
         SUM(fprlcosadj) as FPRL_CoS_Adj,
         SUM(woc_res) as WOC_Reserve,
         SUM(bel) as BEL, 
         SUM(sht) as SH_Transfers, 
         SUM(pol_count) as Pol_Count 
      FROM <<lcFile>> 
      GROUP BY Sim, 
         Company, 
         Fund, 
         LPG_level,
         Output_group, 
         time 
      ORDER BY sim asc,
            output_group asc
      INTO CURSOR bob
ENDTEXT

* These are the variables which were created from the text above. This line combines them and runs them as a select statement
&lcSql1 + &lcSql_fund2 + &lcSql_level + &lcSqlgroup2 + &lcSql2

* Loop over the available report levels (previously exported to the cursor called levels
SELECT levels
SCAN
    * From bob (the cursor created above which has everything in it) for the current report level select out the relevant records
    * and save them to the original filename with the level appended in CSV format
    SELECT * FROM bob WHERE bob.LPG_Level = levels.LPG_Level INTO CURSOR temp
    COPY TO output_path + lcFilename + "_" + ALLTRIM(levels.LPG_Level) + ".csv" TYPE CSV
ENDSCAN


* Next file in list
NEXT i
于 2013-11-01T15:17:37.323 回答
0

尝试类似:

FOR curlevel = 1 TO numlevels
    outfile = 'file' + ALLTRIM(STR(curlevel)) + '.csv'

    TEXT TO contents
        blah blah
    ENDTEXT

    = STRTOFILE(contents, outfile)
ENDFOR

你必须调整一些东西,但这是一种可以使用的技术。

于 2013-10-23T16:05:05.547 回答
0

我不知道为什么你有所有的文本/结尾文本。您可以将 SQL-Select 构建为一个长语句......只需在每行末尾使用分号表示该语句在下一行继续(与 C# 中的 ; 表示语句结束不同).. .

无论如何,这个简化应该做你所拥有的

SELECT ;
      LEFT(ALLTRIM(group),ATC("|",ALLTRIM(group))-1) as Sim, ;
      STREXTRACT(ALLTRIM(group),"|","|",1) as Company, ;
      STREXTRACT(ALLTRIM(group),"|","|",2) as Fund, ;
      STREXTRACT(ALLTRIM(group),"|","|",3) as LPG_level, ;
      RIGHT(ALLTRIM(group),LEN(ALLTRIM(group)) - ATC("|",ALLTRIM(group),4)) as Output_group, ;
      time, ;
      SUM(as) as Asset_Share_Stressed, ;
      SUM(as_us) as Asset_Share_Unstressed ;
   FROM ;
      ( lcFile ) ;
   GROUP BY ;
      Sim, ;
      Company, ;
      Fund, ;
      LPG_level, ;
      Output_group, ;
      time ;
   ORDER BY ;
      sim asc,;
      output_group ASC ;
   INTO ;
      CURSOR bob

SELECT distinct LPG_Level ;
   FROM Bob ;
   INTO CURSOR C_TmpLevels

SELECT C_TmpLevels
SCAN 
   */ You might have to be careful if the LPG_Level has spaces or special characters
   */ that might cause problems in file name creation, but at your discretion.
   lcOutputFile = output_path + "LPG" + ALLTRIM( C_TmpLevels.LPG_Level ) + ".csv"
   SELECT Bob
   COPY TO ( lcOutputFile ) ;
      FOR LPG_Level = C_TmpLevels.LPG_Level ;
      TYPE csv
ENDSCAN 

在这种情况下,我刚刚构建了您的整个 SQL 查询并运行它...从该结果中,我得到了不同的 LPG_Level,因此它与您必须使用的结果集的结构完全匹配。请注意,在“FROM”子句中,括号中有 (lcFile)。这告诉 VFP 查找表名的变量名,而不是名为“lcFile”的实际表作为文字。同样,当我将 OUT 复制到 CSV 文件时...复制到 (lcOutputFile)。

宏“&”可以强大且有用,但也可能会咬你,特别是如果文件名路径中有空格......在这种情况下你是敬酒......在这种情况下尝试习惯使用括号.

于 2013-10-23T16:53:57.667 回答