4

私は日付の文字列を持っています、私は日付と文字列でそれを分割したい

例: 私はこのタイプの文字列データを持っています

9/23/2013/marking abandoned based on notes below/DB
12/8/2012/I think the thid is string/SG

そして、私はそれを次のようにしたい

9/23/2013     marking abandoned based on notes below/DB
12/8/2013     I think the thid is string/SG

したがって、これらの文字列を分割してテーブルの異なる列に格納する方法がわかりません。助けてください。

4

3 に答える 3

11
string[] vals = { "9/23/2013/marking abandoned based on notes below/DB",
                  "12/8/2012/I think the thid is string/SG" };

var regex = @"(\d{1,2}/\d{1,2}/\d{4})/(.*)";

var matches = vals.Select(val => Regex.Match(vals, regex));

foreach (var match in matches)
{
    Console.WriteLine ("{0}     {1}", match.Groups[1], match.Groups[2]);
}

プリント:

9/23/2013     marking abandoned based on notes below/DB
12/8/2012     I think the thid is string/SG

(\d{1,2}/\d{1,2}/\d{4})/(.*)に分解します

  • (\d{1,2}/\d{1,2}/\d{4}):
    • \d{1,2}- 任意の 1 桁または 2 桁の数字に一致
    • //- 1 つのシンボル に一致
    • \d{4}- 4 桁の数字に一致
    • (...)- 最初のグループを示します
  • (.*)- 他のすべてに一致し、2 番目のグループを作成します
于 2013-10-30T15:05:52.970 に答える
0

おそらく純粋な文字列メソッドでは、3 番目のスラッシュが日付とテキストを区切ります。

string line = "9/23/2013/marking abandoned based on notes below/DB";
int slashIndex = line.IndexOf('/');
if(slashIndex >= 0)
{
    int slashCount = 1;
    while(slashCount < 3 && slashIndex >= 0)
    {
        slashIndex = line.IndexOf('/', slashIndex + 1); 
        if(slashIndex >= 0) slashCount++;
    }
    if(slashCount == 3)
    {
        Console.WriteLine("Date:{0}   Text: {1}"
            , line.Substring(0, slashIndex)
            , line.Substring(slashIndex +1));
    }
}

価値のあるものとして、astring の n 番目の出現で文字列を半分に「分割」する拡張メソッドを次に示します。

public static class StringExtensions
{
    public static string[] BreakOnNthIndexOf(this string input, string value, int breakOn, StringComparison comparison)
    {
        if (breakOn <= 0)
            throw new ArgumentException("breakOn must be greater than 0", "breakOn");
        if (value == null) value = " ";  // fallback on white-space

        int slashIndex = input.IndexOf(value, comparison);
        if (slashIndex >= 0)
        {
            int slashCount = 1;
            while (slashCount < breakOn && slashIndex >= 0)
            {
                slashIndex = input.IndexOf(value, slashIndex + value.Length, comparison);
                if (slashIndex >= 0) slashCount++;
            }
            if (slashCount == breakOn)
            {
                return new[] { 
                    input.Substring(0, slashIndex), 
                    input.Substring(slashIndex + value.Length) 
                };
            }
        }
        return new[]{ input };
    }
}

次のように使用します。

string line1 = "9/23/2013/marking abandoned based on notes below/DB";
string line2 = "12/8/2012/I think the thid is string/SG";
string[] res1 = line1.BreakOnNthIndexOf("/", 3, StringComparison.OrdinalIgnoreCase);
string[] res2 = line2.BreakOnNthIndexOf("/", 3, StringComparison.OrdinalIgnoreCase);
于 2013-10-30T15:13:05.673 に答える
0

LINQ でそれを行う別の方法:

var inputs = new[]{
    "9/23/2013/marking abandoned based on notes below/DB",
    "12/8/2012/I think the thid is string/SG"
};

foreach (var item in inputs)
{
    int counter = 0;
    var r = item.Split('/')
        .Aggregate("", (a, b) =>
            a + ((counter++ == 3) ? "\t" : ((counter == 1) ? "" : "/")) + b);
    Console.WriteLine(r);
}

または、 メソッドIndexOfSubstringメソッドを使用することもできます。

foreach (var item in inputs)
{
    var lastPos = 
        item.IndexOf('/', 
            1 + item.IndexOf('/', 
                1 + item.IndexOf('/')));
    if (lastPos != -1)
    {
        var r = String.Join("\t", 
            item.Substring(0, lastPos), 
            item.Substring(lastPos + 1, item.Length - lastPos - 1));
        Console.WriteLine(r);
    }
}
于 2013-10-30T15:16:19.307 に答える