2016-05-02 12 views
-1

SQLコマンドに '/'を加えたテキストファイルがありますが、/ ** /とスペースのようなコメントも含まれています。 すべてのコマンドを実行できるようにファイルを解析する必要がありますが、コメントを無視する必要があります。 私はこの小さなコードをやったが、何らかの理由でそれがテキストファイルに存在する行の半分も私を与えるdoesntの:正規表現を使用してテキストファイルからSQLコマンドを解析するC#

public string[] Parser(string caminho) 
{ 
    using (StreamReader sr = new StreamReader(caminho, Encoding.Default)) 
    { 
     string text = sr.ReadToEnd(); 
     string[] lines = text.Split('/'); 
     return lines; 
    } 
} 

は、正規表現を使用してこれをaproachためにとにかくありますか?すべてのヘルプはhigly aprecciatedだろう

https://drive.google.com/file/d/0B1xc1ft-s78NTHdZdlpTTWlfLVE/view?usp=sharing

:ここ

はコマンドで.txtファイルへのリンクです。

コメントを
UPDATE APPLCONFIG SET GGDSC='3.5.96' WHERE GGCOD='APP_NAME' 
/

UPDATE APPLCONFIG SET GGDSC='3.5.96' WHERE GGCOD='NEG_NAME' 
/
UPDATE APPLCONFIG SET GGDSC='3.5.96' WHERE GGCOD='DAT_NAME' 
/

ALTER TABLE PROPOSTAS ADD (COEFGERAL_PLT NUMBER(3,6) DEFAULT 0) 
/

ALTER TABLE ORC 
    ADD MercadoInt VARCHAR2(1) 
    ADD Coef_KrMo NUMBER(20,10) 
    ADD Coef_KrMt NUMBER(20,10) 
    ADD Coef_KrEq NUMBER(20,10) 
    ADD Coef_KrSb NUMBER(20,10) 
    ADD Coef_KrGb NUMBER(20,10) 
    ADD Coef_MDEmp NUMBER(20,10) 
    ADD Coef_MDLoc NUMBER(20,10) 
    ADD Abrv_MDLoc VARCHAR2(10) 
    ADD Dsc_MDLoc VARCHAR2(50) 
    ADD Arred_MDLoc VARCHAR2(1) 
    ADD Arred_NDecs NUMBER(1) 
/
UPDATE Orc set MercadoInt='N', Coef_KrMo=1, Coef_KrMt=1, Coef_KrEq=1, Coef_KrSb=1, Coef_KrGb=1, Coef_MDEmp=1, Coef_MDLoc=1, Abrv_MDLoc='', Dsc_MDLoc='', Arred_MDLoc='N', Arred_NDecs=0 WHERE MercadoInt IS NULL 
/

DROP VIEW VW_EXPSUBEEXCELL 
/

、他の部分:

/ 

--------------------------------------------------------------------- 

UPDATE CDPREPORTSQL 
SET COMANDOSQL_FROM = 
'SELECT DESCONTO,EMPCOD,EMPDSC,LINVER,NOMESISTEMA,OBS,ORCCOD,ORCVER,PEDCOD,PEDDSC, 
ROUND(PRCUNIT*#CAMBIO#,5) PRCUNIT, 
ROUND(PRCUNITSEMDESC*#CAMBIO#,5) PRCUNITSEMDESC, 
PROPCHECK,QTDGLOB,QTDPROP,REFCOD,REFDSC,EMPCODVER, COEFGERAL_PLT FROM #OWNER#.VW_PROPOSTAS', 
COMANDOSQL_WHERE = 
'WHERE ORCCOD=#ORCCOD# AND ORCVER=#ORCVER# AND NOMESISTEMA=#NOMESISTEMA# AND PEDCOD=#MYCOD#' 
WHERE REPID = 'CDP0000057' 
/

--------------------------------------------------------------------- 

DROP VIEW VW_PROPSRECEPSOUTROS 
/

CREATE OR REPLACE FORCE VIEW VW_PROPSRECEPSOUTROS (orccod, 
                   orcver, 
                   nomesistema, 
                   pedcod, 
                   peddsc, 
                   empcod, 
                   empcodver, 
                   empdsc, 
                   pedtprec, 
                   linver, 
                   totproposta, 
                   totdesconto, 
                   totpropsel, 
                   totmin 
                  ) 
AS 
SELECT b.orccod, b.orcver, b.nomesistema, b.pedcod, b.peddsc, p.empcod, 
      p.empcodver, h.empdsc, b.pedtprec, l.linver, 
      SUM ( ((l.qtdorc * pp.indfis) * ( (p.prcunit * (1 + p.deconto))) * (1 + p.coefgeral_plt) 
        * (CASE 
          WHEN r.tprec = '1' 
          THEN o.coef_krmo 
          WHEN r.tprec = '2' 
          THEN o.coef_krmt 
          WHEN r.tprec = '3' 
          THEN o.coef_kreq 
          WHEN r.tprec = '4' 
          THEN o.coef_krsb 
          ELSE 1 
         END 
        ) 
        ) 
       ) totproposta, 

      SUM((l.qtdorc * pp.indfis * p.prcunit) - ((l.qtdorc * pp.indfis) * ( (p.prcunit * (1 + p.deconto))) * (1 + p.coefgeral_plt) 
        * (CASE 
          WHEN r.tprec = '1' 
          THEN o.coef_krmo 
          WHEN r.tprec = '2' 
          THEN o.coef_krmt 
          WHEN r.tprec = '3' 
          THEN o.coef_kreq 
          WHEN r.tprec = '4' 
          THEN o.coef_krsb 
          ELSE 1 
         END 
        ) 
        ) 
       ) * -1 as TOTDESCONTO, 
      /* SUM 
       ( (CASE 
         WHEN (NVL (p.deconto, 0) + NVL(p.coefgeral_plt,0)) <> 0 
         THEN (l.qtdorc * pp.indfis) * ((
            (p.prcunit * (case when p.deconto <> 0 then p.deconto else 1 end)) * 
            case when p.coefgeral_plt <> 0 then p.coefgeral_plt else 0 end) 
           * (CASE 
             WHEN r.tprec = '1' 
              THEN o.coef_krmo 
             WHEN r.tprec = '2' 
              THEN o.coef_krmt 
             WHEN r.tprec = '3' 
              THEN o.coef_kreq 
             WHEN r.tprec = '4' 
              THEN o.coef_krsb 
             ELSE 1 
            END 
            ) 
           ) 
         ELSE 0 
        END 
       ) 
       * (-1) 
       ) totdesconto_old,*/ 
      SUM 
       ((CASE 
        WHEN p.empsel = 1 
         THEN ((l.qtdorc * pp.indfis) * ((p.prcunit * (1 + p.deconto)) * (1 + p.coefgeral_plt)) 
           * (CASE 
            WHEN r.tprec = '1' 
             THEN o.coef_krmo 
            WHEN r.tprec = '2' 
             THEN o.coef_krmt 
            WHEN r.tprec = '3' 
             THEN o.coef_kreq 
            WHEN r.tprec = '4' 
             THEN o.coef_krsb 
            ELSE 1 
            END 
           ) 
          ) 
        ELSE 0 
       END 
       ) 
       ) propsel, 
       NVL (SUM ( (l.qtdorc * pp.indfis) * (SELECT MIN ((pp.prcunit * (1 + pp.deconto)) * (1 + pp.coefgeral_plt)) 
          FROM propostas pp 
          WHERE p.orccod = pp.orccod 
           AND p.orcver = pp.orcver 
           AND p.nomesistema = pp.nomesistema 
           AND p.pedcod = pp.pedcod 
           AND p.recurcod = pp.recurcod 
           AND pp.prcunit > 0 
           AND p.prcunit = 0 
           AND NVL (p.obs, '@') = '@') 
         ), 
        0 
       ) 
      + NVL (SUM ( (l.qtdorc * pp.indfis) * (((p.prcunit * (1 + p.deconto)) * (1+p.coefgeral_plt)) 
          * (CASE 
           WHEN r.tprec = '1' 
            THEN o.coef_krmo 
           WHEN r.tprec = '2' 
            THEN o.coef_krmt 
           WHEN r.tprec = '3' 
            THEN o.coef_kreq 
           WHEN r.tprec = '4' 
            THEN o.coef_krsb 
           ELSE 1 
           END 
          ) 
         ) 
         ), 
        0 
       ) totmin 
     FROM pedproposta b, 
      propostas p, 
      empresash h, 
      recursos r, 
      prcficha pp, 
      articlin l, 
      orc o 
     WHERE o.orccod = b.orccod 
     AND o.orcver = b.orcver 
     AND o.nomesistema = b.nomesistema 
     AND b.orccod = p.orccod 
     AND b.orcver = p.orcver 
     AND b.nomesistema = p.nomesistema 
     AND b.pedcod = p.pedcod 
     AND p.empcod = h.empcod 
     AND p.orccod = r.orccod 
     AND p.orcver = r.orcver 
     AND p.nomesistema = r.nomesistema 
     AND p.recurcod = r.recurcod 
     AND p.recver = r.recver 
     AND p.rgmcod = r.rgmcod 
     AND p.orccod = pp.orccod 
     AND p.orcver = pp.orcver 
     AND p.nomesistema = pp.nomesistema 
     AND p.recurcod = pp.recurcod 
     AND p.recver = pp.recver 
     AND p.rgmcod = pp.rgmcod 
     AND pp.orccod = l.orccod 
     AND pp.orcver = l.orcver 
     AND pp.nomesistema = l.nomesistema 
     AND pp.prccod = l.prccod 
     AND pp.prcver = l.prcver 
     and b.pedtprec = '2' 
    GROUP BY b.orccod, 
      b.orcver, 
      b.nomesistema, 
      p.empcod, 
      p.empcodver, 
      h.empdsc, 
      b.pedtprec, 
      l.linver, 
      b.pedcod, 
      b.peddsc 
/

私は、コマンドを取得し、他のすべてを無視する必要があります。ここ

は、ファイルの例です。ありがとうございます。

+0

テキストファイルの例を示し、あなたの元の質問を編集することができ、の例を表示するには、より簡単だっただろうと、あなたは、ファイルへのリンクを投稿してはなりませんファイルとその元の投稿の区切り記号です。また、予期しない出力がどのように表示されるかを説明したり表示したりします。 string.Split()関数は、分割しているものが分かっている場合には非常に使いやすいです。あなたは複数のデリミタを指定することができます。btw – MethodMan

+0

ファイルが大きすぎてここに投稿できないため、リンクを投稿しました。しかし私はあなたが示唆したように編集するが、私はあなたにリンクplsを確認するよう依頼する。区切り記号は私が使用する「/」です。 @MethodMan –

+0

リンクが安全であることを知っている今、悪意のあるコンテンツなどがあるので、私はリンクをチェックしません。ただ2つの異なる区切り文字を示す単一の行を投稿してください。 – MethodMan

答えて

0

正規表現の代わりに/* ... */を空の文字列に置き換えてから、Split()を実行します。何かのように

var foo = Regex.Replace(text, @"\/\**?\*\/", " "); 

コメントを削除します。これらのクエリのいずれかに/文字が含まれている場合、あなたはまだ問題があることを、

var lines = foo.Split(new[]{'/'}, StringSplitOptions.RemoveEmptyEntries) 
    .Where(line => !string.IsNullOrWhiteSpace(line)) 
    .ToArray(); 

ただし:あなたが分割を行うと、空行を無視するよう指示し、空白のみを含む行を除外するたとえば、引用符で囲まれた文字列。

これは、コメント、引用符付きの文字列などを認識できるパーサーで行う方がよいでしょう。しかし、あなたが限界を乗り越えることができれば、上記はうまくいくはずです。ここで

は、完全なコードは次のとおりです。

public string[] Parser(string caminho) 
{ 
    string text = File.ReadAllText(caminho); 
    var foo = Regex.Replace(text, @"\/\**?\*\/", " "); 
    var lines = foo.Split(new[]{'/'}, StringSplitOptions.RemoveEmptyEntries) 
     .Where(line => !string.IsNullOrWhiteSpace(line)) 
     .ToArray(); 
    return lines; 
} 
+0

私は助けを事前にしました、良いアイデアのように思え、あなたは私の懸念のいくつかを指摘しました。私はサードパーティのソフトウェアを使用することはできないと思うが、私はMSがSQLパーサーを持つ名前空間を持っていることを知っている。私はそれを使用する方法を知りませんし、見つけた例は恐ろしいです。 私はMicrosoft.SqlServer.Management.SqlParserについて話しています。 –

+0

@ Mr.Toxy、そのコードはMSSQL Serverではありません。 – Crowcoder

+0

@Crowcoderあなたは正しいですが、おそらくParserがoracleステートメントで動作することができるでしょう –

関連する問題