我有一个SQL脚本,如下所示,用于使用一些数据填充db表。 然后我在VS2010中使用C#中的StreamReader读取此文件。我想知道的是,一旦我将此文件作为字符串读入,我如何将每个单独的参数拆分为子字符串?
所以我最理想的是将每个VALUE参数读入它自己独立的子字符串中,以便我可以处理它。
SQL SCRIPT:
...
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 )
我正在调试这个并尝试几种不同的方法,一种使用String.Split(),另一种使用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 Regex会找到插入参数的值,这很正常。 (注意我已经用\ n字符更新了SQL文件,以显示文件的布局以及在读入时如何将其存储在字符串变量中)。请注意,在My_Message值中可以有&#39;,&#39;和&#39; \ n&#39;案例。但是,每个参数的结尾可以由&#39;,\ n&#39;唯一标识。但是我无法在Regex和String中使用它.String.Split()只能使用1个字符。
列表保存了每个匹配项的每个案例,因为我在SQL脚本中有超过50个条目,因此我需要将每个插入语句中的每个单独的ID,标题和消息拆分为3个单独的变量,这些变量嵌套在循环中。
目前,splitGroup []字符串对象返回太多的子字符串,因为我们在参数值中有新行,而使用Regex的split []字符串对象只是将它全部作为一个字符串返回。
我希望此更新信息有用 提前谢谢!
答案 0 :(得分: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
}
}
答案 1 :(得分: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;
}