1

次のようなSQLスクリプトを使用して、dbテーブルにデータを入力します。次に、VS2010 の C# で StreamReader を使用してこのファイルを読み込んでいます。私が知りたいのは、このファイルを文字列として読み取った後、個々のパラメーターを部分文字列に分割するにはどうすればよいかということです。

したがって、理想的には、個々の VALUE パラメータを個別の部分文字列に読み取って、これを処理できるようにすることです。

SQL スクリプト:

...

INSERT INTO [dbo].[My_Table] ( \n My_ID, \n My_Title, \n My_Message \n ) VALUES ( \n 40, \n 'Hello, This is the message title', \n 'Hello, This is \n the message body' \n )

INSERT INTO [dbo].[My_Table] ( \n My_ID, \n My_Title, \n My_Message \n ) VALUES ( \n 41, \n 'Hello again, This is another message title', \n 'Hello again, This is \n another message body' \n )

私は現在これをデバッグしており、1 つは String.Split() を使用し、もう 1 つは Regex アプローチを使用して、いくつかの異なるアプローチを試みています。

ここに私のC#コードがあります:

// this is to find the VALUES parameters in the SQL file
private static readonly Regex matchValues = new Regex(@".*?VALUES.*?\((.*?)\)",
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant
|RegexOptions.Singleline);

// fileText is the string object containing the raw text read in from the SQL file
public static string FindMatches(string fileText)
{
    List<Match> matches = matchValues.Matches(fileText).Cast<Match>().ToList();

    foreach (Match match in matches)
    {
         string value = match.Groups[1].Value;
         string pattern = @"^,$";

         // do work

         string[] delimiters = new string[] { ",\n" };

         string[] splitGroup = value.Split(delimiters, StringSplitOptions.None);

         string[] split = Regex.Split(value, pattern);

     }
}

したがって、このコードを簡単に説明できれば、matchValues 正規表現は挿入パラメーターの値を見つけており、これは正常に機能しています。(ファイルのレイアウトと、読み込まれたときに文字列変数に格納される方法を示すために、SQL ファイルを \n 文字で更新したことに注意してください)。My_Message 値には、',' および '\n' のケースがあることに注意してください。ただし、各パラメーターの末尾は「,\n」で一意に識別できますが、これを正規表現で機能させることができず、String.Split() は 1 文字しか使用できません。

リストには、SQL スクリプトに 50 を超えるエントリがあるため、検出された各一致の各ケースが保持されます。そのため、各 Insert ステートメントの個々の ID、タイトル、およびメッセージを、ループ内にネストされた 3 つの個別の変数に分割する必要があります。

現在、splitGroup[] 文字列オブジェクトが返している部分文字列が多すぎます。これは、パラメーター値に改行があり、正規表現を使用する split[] 文字列オブジェクトがすべてを 1 つの文字列として返すだけだからです。

この更新された情報がお役に立てば幸いです。
前もって感謝します!

4

2 に答える 2

1

複数行のデータに一致するように RegexOptions を設定できます。これは、正規表現がドル記号 $ を文字列の末尾ではなく行末と一致させることを意味します。コードは次のとおりです。

string strRegex = @"^Regex Test";
RegexOptions myRegexOptions = RegexOptions.Multiline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"Regex Test for stackoverflow.";

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Add your code here
  }
}
于 2012-06-12T17:21:42.517 に答える
0

次を使用することもできますString.Split

var inserts = File.ReadLines(path)
         .Where(l => l.IndexOf("VALUES (") > -1)
         .Select(l => new
         {
             SQL = l,
             Params = l.Substring(l.IndexOf("VALUES (") + 8)
                       .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
         });
foreach (var insert in inserts)
{
    String sql = insert.SQL;
    String[] parameter = insert.Params;
}
于 2012-06-12T17:30:31.750 に答える