2017-01-25 2 views
-1

私は、ケースの意志で、私はこの文字列は、テーブルAC#で文字列のキーワードを大文字にします(SQLによるキーワードの美化)?

FROM SELECT *に変換する必要がある文字列

string Query = "Select * fRom TableA" 

でこれらのキーワードを大文字にしたいいくつかのキーワード

private static readonly string[] Keywords = 
{ 
    "SELECT", "FROM", "WHERE", "GROUP", "HAVING", "ORDER", "LEFT", "RIGHT", JOIN", "INNER", "OUTER", "ASC", "DESC", "AND", "OR","IN", "BETWEEN", "BY", "NOT", "ON", "AS", "CASE", "WHEN", "ELSE" 
}; 

を持っています無視され、キーワードは大文字になります。このため

、私は

public static string GetUppercaseKeyword(string sqlStr) 
    { 
     string sqlText = string.Empty; 
     int foundAt = 0; 

     foreach (var keyword in Keywords) 
     { 
      if (sqlStr.IndexOf(keyword, foundAt, StringComparison.CurrentCultureIgnoreCase) == -1) 
      { 
       continue; 
      } 

      sqlStr = Replace(sqlStr, keyword, keyword.ToUpper(), StringComparison.OrdinalIgnoreCase); 
     } 

     return sqlStr; 
    } 

と置き換える機能機能を書かれている部分文字列は、キーワードで大文字の方法と一致した場合、ここで起こる

public static string Replace(string str, string old, string @new, StringComparison comparison) 
    { 
     @new = @new ?? ""; 
     if (string.IsNullOrEmpty(str) || string.IsNullOrEmpty(old)) 
      return str; 
     int foundAt = 0; 
     while ((foundAt = str.IndexOf(old, foundAt, StringComparison.CurrentCultureIgnoreCase)) != -1) 
     { 
      str = str.Remove(foundAt, old.Length).Insert(foundAt, @new); 
      foundAt += @new.Length; 
     } 
     return str; 
    } 

事は、ありさ部分文字列、のように置き換えます。メソッドを使用します。IndexOf

たとえば、select * OrderTableからSELECT * FROM ORDERTABLEが出力されます。

どうすれば問題を解決できますか?

私の他の質問は、それを実装する簡単な方法はありますか?このタイプの目的のための既存のアルゴリズムはありますか?

+2

ここで他のメソッドやクラスを定義するの感嘆符疑問符など –

+2

@rory正規表現では単語境界を正しく検出することができます – CodeCaster

+2

_ "これは簡単に実装できますか?" - どのようにSQLを解析し、それをきれいに印刷するのですか? ([From]、[As]、[On])の値( 'select'、 'table'、 'table')に挿入することで、大文字と小文字を区別するデータベースエンジンに渡されます)。Abanあなたがまだできる限り、この船を着けなさい。 _ウェル_するか、まったくやらないでください。 – CodeCaster

答えて

1

ここが方法です。

void Main() 
{ 

    Console.WriteLine(Replace()); 

} 

private static readonly string[] Keywords = 
{ 
    "SELECT", "FROM", "WHERE", 
    "GROUP", "HAVING", "ORDER", 
    "LEFT", "RIGHT", "JOIN", "INNER", 
    "OUTER", "ASC", "DESC", "AND", "OR","IN", 
    "BETWEEN", "BY", "NOT", "ON", "AS", "CASE", "WHEN", "ELSE" 
}; 

static string Query = "Select * fRom TableA"; 

static bool Exists(string word) => 
    Keywords.Any(x => x.Equals(word, StringComparison.OrdinalIgnoreCase)); 


static string Replace() 
{ 
    var parts = Query.Split(' '); 

    var upperedParts = parts.Select(x => (Exists(x)) ? x.ToUpper() : x); 

    return String.Join(" ", upperedParts); 

} 

//、これはあなたが常に空白を意味するものではありません。これは、単語の境界を把握する必要がありますよう、本当にトリッキーになるだろう(期間を考える

+1

'select [foo]、[bar] from [table]'は有効なSQLです。スペース区切り文字( 'Query.Split( '')')は適切な実装のためにあまりにも素朴です。キーワードは、置き換えたいカラム名やエイリアスとしても使用できます。 – CodeCaster

関連する問題