0

次のような形式のファイルがたくさんあります。

20130201:14:58:47 I search: xx ('ID'= (xxxxxxxx) )
20130201:14:58:56 I request: search | For ID | Search
20130201:14:58:56 I search: xx ('ID'= (xxxxxxx) )

C# には Python にあるようなレストキーと呼ばれるものがありますか? 最初の 3 つの項目 (日時、I (アクションと呼ばれる)、検索/要求) を取得し、それらのそれぞれを SQL テーブルの独自の列に挿入し、4 番目の列に残りの行を挿入します。

Python では、これは非常に簡単でしたが、SQL テーブルに挿入するためにジャンプしなければならなかったすべてのフープを処理できませんでした。そこで、SSMS への接続がより簡単な C# に移行しました。

4

5 に答える 5

3

String.Split()おそらくそれは素晴らしくて簡単な方法ですが、私はこの種の構文解析に使用することを好みますRegex。この場合、次のようなパターンです。

(?<DateTime>\d{8}\:\d{2}\:\d{2}\:\d{2})\s(?<Action>\w)\s(?<SearchOrRequest>search|request)\:\s(?<RestOfTheLine>.*)

「DateTime」、「Action」、「SearchOrRequest」、「RestOfLine」の一致グループに適切にグループ化された、必要なすべてのものを提供します。

var pattern = "(?<DateTime>\d{8}\:\d{2}\:\d{2}\:\d{2})\s(?<Action>\w)\s(?<SearchOrRequest>search|request)\:\s(?<RestOfTheLine>.*)";
var regex = new Regex(pattern);
var match = regex.Match(inputString);

var theDate = match.Groups["DateTime"].Value;
var theAction = match.Groups["Action"].Value;
var theChoice = match.Groups["SearchOrRequest"].Value;
var theRest = match.Groups["RestOfTheLine"].Value;
于 2013-02-15T23:37:45.690 に答える
0

少し違うアプローチを試しました。これらのファイルを完全修飾csvファイルに変換できるコンソールプログラムを作成しました。次に、ssmsを使用してSQLに非常に簡単にインポートできます。

static void Main(string[] args)
    {
        if (args.Length == 2)
        {
            using (StreamWriter sw = new StreamWriter(args[1]))
            {
                using (StreamReader sr = new StreamReader(args[0]))
                {
                    String line;

                    while ((line = sr.ReadLine()) != null)
                    {
                        int index = 0;
                        int oldIndex = 0;
                        string dateTime = null;
                        string action = null;
                        string task = null;
                        string details = null;

                        index = line.IndexOf(' ', oldIndex);
                        dateTime = line.Substring(oldIndex, index - oldIndex);
                        oldIndex = index + 1;

                        index = line.IndexOf(' ', oldIndex);
                        action = line.Substring(oldIndex, index - oldIndex);
                        oldIndex = index + 1;

                        index = line.IndexOf(':', oldIndex);
                        task = line.Substring(oldIndex, index - oldIndex);
                        oldIndex = index + 1;

                        details = line.Substring(oldIndex + 1);

                        sw.WriteLine("\"{0}\",\"{1}\",\"{2}\",\"{3}\"", dateTime, action, task, details);
                    }
                }

            }
        }
        else
        {
            Console.WriteLine("Usage: program <input> <output>");
        }
    }
于 2013-02-15T23:36:30.017 に答える
0

.NET 関数String.Split()を使用して実行できます。

日付文字列が固定長であると仮定すると、これは機能するはずです。

        //string inputStr = "20130201:14:58:47 I search: xx ('ID'= (xxxxxxxx) )";
        //string inputStr = "20130201:14:58:56 I request: search | For ID | Search";
        string inputStr = "20130201:14:58:56 I search: xx ('ID'= (xxxxxxx) )";

        string dateStr = inputStr.Substring(0, 17);
        string[] splitStr = inputStr.Substring(18).Split(new char[] { ':' });

        string actionStr = splitStr[0].Substring(0, splitStr[0].IndexOf(' '));
        string userStr = splitStr[0].Substring(2);
        string restStr = splitStr[1].TrimStart();

        // print out what we parsed
        Console.WriteLine(inputStr);
        Console.WriteLine(dateStr);
        Console.WriteLine(actionStr);
        Console.WriteLine(userStr);
        Console.WriteLine(restStr);

出力:

20130201:14:58:56 I search: xx ('ID'= (xxxxxxx) )
20130201:14:58:56
I
search
xx ('ID'= (xxxxxxx) )
于 2013-02-15T23:33:37.940 に答える
0

これは、おそらく正規表現を使用するのが適切なケースです。

var testVectors = new[]
{
    "20130201:14:58:47 I search: xx ('ID'= (xxxxxxxx) )",
    "20130201:14:58:56 I request: search | For ID | Search",
    "20130201:14:58:56 I search: xx ('ID'= (xxxxxxx) )"
};

var expression = @"^(?<TimeStamp>[0-9]{8}(:[0-9]{2}){3}) (?<Action>[^ ]+) (?<Type>search|request): (?<Rest>.*)$";

var regex = new Regex(expression);

foreach (var testVector in testVectors)
{
    var match = regex.Match(testVector);

    Console.WriteLine(match.Groups["Timestamp"]);
    Console.WriteLine(match.Groups["Action"]);
    Console.WriteLine(match.Groups["Type"]);
    Console.WriteLine(match.Groups["Rest"]);
}

使用される式は、いくつかの仮定を立てます。あなたがアクションと呼んだのは、スペースを含まない一連の文字であり、私がタイプsearchrequest呼ぶものの有効な値です。しかし、仮定のいずれかが成り立たない場合、式を採用するのは簡単なはずです。

于 2013-02-15T23:46:47.820 に答える
0

string.Split メソッドの使用

string myString = "20130201:14:58:47 I search: xx (\'ID\'= (xxxxxxxx) )"

string[] strarr = myString.split(' ');

string theLetterIVariableThing = strarr[1];

string iddate = strarr[0];

StringBuilder sb = new StringBuilder();

for (int i = 1; i < strarr.Length; i++)
{
    sb.Append(strarr[i]);
    sb.Append(" ");
}

string trailingText = sb.ToString();

string id = iddate.split(':')[0];

sb.Clear();

for (int i = 1; i < 4; i++)
{
    sb.Append(iddate.split(':'))[i];
}

string date = sb.ToString();

これでうまくいくと思いますが、おそらく遠回りです。

于 2013-02-15T23:15:20.387 に答える