-2

我有一个批处理文件(.bat),其中包含如下文本:

osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i sp_RejectAccounts_qsel.sql -o sp_RejectAccounts_qsel.out
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i sp_RejectAccounts_sel.sql -o sp_RejectAccounts_sel.out
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i sp_GetCompanyRecordCardRequest_01Aug2012.sql -o sp_GetCompanyRecordCardRequest_01Aug2012.out
osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i SPGetCreditTransactions.sql -o SPGetCreditTransactions.out

我需要一种方法来获取所有 .sql 文件,比如一个字符串数组。
文本有一些变化。正则表达式应该找到 .sql 然后向左移动直到找到一个空格。

4

4 回答 4

1
        List<string> sqls = File.ReadAllLines("Utils.txt")
                                .Select(s =>
                                {
                                    string temp = s.Substring(s.IndexOf("<"));
                                    return temp = temp.Substring(1, temp.IndexOf(">") - 1).Trim();
                                })
                                .ToList();

因此,您可以指定任何算法以在Select. 如果您指定了有关文件名如何出现在文件中的更多信息,则可以提供更特殊的代码

编辑

这是另一个示例Regex

        string regex = @"(?<sql>[\w]{1,}.sql)";
        List<string> sqls = File.ReadAllLines("Utils.txt")
                                .Select(s =>
                                {
                                    Match m = Regex.Match(s, regex);
                                    if (m.Success)
                                        return m.Groups["sql"].Value;
                                    else
                                        return string.Empty;
                                })
                                .ToList();

编辑

List<string> sqls = File.ReadAllLines("Utils.txt").Select(s => s.Split(' ').FirstOrDefault(f => f.Contains(".sql"))).ToList();

编辑

AAA您可以将我之前给您的正则表达式更改为

string regex = @"(?<sql>[\S]{1,}.sql)";

并获得与通过相同的结果Split

于 2012-08-24T05:38:53.613 回答
1

你可以这样做:

        string input = @"osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i sp_RejectAccounts_qsel.sql -o sp_RejectAccounts_qsel.out
                        osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i sp_RejectAccounts_sel.sql -o sp_RejectAccounts_sel.out
                        osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i sp_GetCompanyRecordCardRequest_01Aug2012.sql -o sp_GetCompanyRecordCardRequest_01Aug2012.out
                        osql -S %ServerName% -d %DBName% -U %sql_login% -P %sql_passwd% -n -i SPGetCreditTransactions.sql -o SPGetCreditTransactions.out";

        List<string> names = Regex.Matches(input, @"[^\s]+\.sql")
                .Cast<Match>()
                .Select(o => o.Groups[0].Value)
                .ToList();
于 2012-08-24T07:16:36.790 回答
0

你可以这样做。(我使用 List 作为输入的容器)。我不知道它是否有效,可能需要对索引 + 和 - 进行一些调整。取决于空格。

var a = new List<string>{"sqlplus %1/%2 < %ORACLE_CreateScriptsPath%\VersionInsertScript_Or.sql > %ORACLE_CreateScriptsPath%\VersionInsertScript_Or.out",
"sqlplus %1/%2 <  %ORACLE_CreateScriptsPath%\Create_GT_GenerateInvoiceTxnsReportData.sql > %ORACLE_CreateScriptsPath%\Create_GT_GenerateInvoiceTxnsReportData.out",
"sqlplus %1/%2 <  %ORACLE_CreateScriptsPath%\Create_GT_GenerateInvoiceTxnReportDataRD.sql > %ORACLE_CreateScriptsPath%\Create_GT_GenerateInvoiceTxnReportDataRD.out",
"sqlplus %1/%2 <  %ORACLE_CreateScriptsPath%\Create_GT_GenerateTXNInvestigationReport.sql > %ORACLE_CreateScriptsPath%\Create_GT_GenerateTXNInvestigationReport.out",
"sqlplus %1/%2 <  %ORACLE_CreateScriptsPath%\GenerateInvoiceTxnsReportData.sql > %ORACLE_CreateScriptsPath%\GenerateInvoiceTxnsReportData.out",
"sqlplus %1/%2 <  %ORACLE_CreateScriptsPath%\GenerateInvoiceTxnReportDataRD.sql > %ORACLE_CreateScriptsPath%\GenerateInvoiceTxnReportDataRD.out"};

var strings = new List<string>();

foreach(var input in a)
{
var tmpString = input.Substring(input.IndexOf("<")+3);
tmpString = tmpString.Remove(tmpString.IndexOf(">")-1);
strings.Add(tmpString);
}
//Here you have all the SQL files accessible in the strings collection

也可以使用 split 来获取文件名。像这样的东西。

var fileNames= input.Split(" ").Where(f => f.Contains(".sql")).ToList();
于 2012-08-24T05:38:55.787 回答
0

下面是执行此操作的代码。

        var input =
            @" > %ORACLE_CreateScriptsPath%\VersionInsertScript_Or.out 

sqlplus %1/%2 < %ORACLE_CreateScriptsPath%\Create_GT_GenerateInvoiceTxnsReportData.sql > %ORACLE_CreateScriptsPath%\Create_GT_GenerateInvoiceTxnsReportData.out sqlplus %1/%2 < %ORACLE_CreateScriptsPath%\Create_GT_GenerateInvoiceTxnReportDataRD.sql > %ORACLE_CreateScriptsPath%\Create_GTnsqlplusGenerateInvoice%1/% < %ORACLE_CreateScriptsPath%\Create_GT_GenerateTXNInvestigationReport.sql > %ORACLE_CreateScriptsPath%\Create_GT_GenerateTXNInvestigationReport.out sqlplus %1/%2 < %ORACLE_CreateScriptsPath%\GenerateInvoiceTxnsReportData.sql > %ORACLE_CreateScriptsPath%\GenerateInvoiceTxnsReportData.out sqlplus %1/%_CreateData\voiceTxLEnScriptsPath%2 <GenerateInvoiceTxnsReportData.out .sql > %ORACLE_CreateScriptsPath%\GenerateInvoiceTxnReportDataRD.out";

        var matches = Regex.Matches(input, @"ORACLE_CreateScriptsPath%\\(.*) >");

        // here is your string array.
        var results = matches.Cast<Match>().Select(m => m.Groups[1]);

        // echo results.
        Console.Out.WriteLine(string.Join("\r\n", results));
于 2012-08-24T06:42:44.490 回答