使用不一致的分隔符拆分数据

时间:2014-06-20 11:09:07

标签: c# .net regex split delimiter

我将这些数据文件添加到服务器上,我需要将其分成[date time]和[value]。它们中的大多数在时间和值之间划分一次,在日期和时间之间划分为space。我已经有一个程序通过简单的拆分(char [])处理数据,但现在找到的数据的分隔符是space,我想知道如何解决这个问题。

所以我遇到的大多数文件都是这样的:

18-06-2014 12:00:00|220.6

分隔符各不相同,但我用char []解决了这个问题。但今天我遇到了这种格式的问题:

18-06-2014 12:00:00 220.6

这使事情变得复杂一点。简单的解决方案是在我的分割字符中添加space,当我发现3个分割时,在处理之前将前两个组合起来?

我正在寻找关于这个问题的第二个问题。此外,时间格式可以更改为d/m/yy,并且行数可以达到数百万,因此我希望尽可能保持高效。

5 个答案:

答案 0 :(得分:2)

是的,我认为最有效的解决方案是添加空格作为分隔符,然后如果你得到三个就合并前两个。这将比正则表达更有效。

答案 1 :(得分:1)

你有一个字符串18-06-2014 12:00:00 220.6,其中前19个字符是日期,一个字符是分隔符号,其他字符是值。所以:

var test = "18-06-2014 12:00:00|220.6";
var dateString = test.Remove(19);
var val = test.Substring(20);

添加了规范化:

static void Main(string[] args) {
    var test = "18-06-2014 12:00:00|220.6";
    var test2 = "18-6-14 12:00:00|220.6";
    var test3 = "8-06-14 12:00:00|220.6";
    Console.WriteLine(test);
    Console.WriteLine(TryNormalizeImportValue(test));
    Console.WriteLine(test2);
    Console.WriteLine(TryNormalizeImportValue(test2));
    Console.WriteLine(test3);
    Console.WriteLine(TryNormalizeImportValue(test3));
}
private static string TryNormalizeImportValue(string value) {
    var valueSplittedByDateSeparator = value.Split('-');
    if (valueSplittedByDateSeparator.Length < 3) throw new InvalidDataException();
    var normalizedDay = NormalizeImportDayValue(valueSplittedByDateSeparator[0]);
    var normalizedMonth = NormalizeImportMonthValue(valueSplittedByDateSeparator[1]);
    var valueYearPartSplittedByDateTimeSeparator = valueSplittedByDateSeparator[2].Split(' ');
    if (valueYearPartSplittedByDateTimeSeparator.Length < 2) throw new InvalidDataException();
    var normalizedYear = NormalizeImportYearValue(valueYearPartSplittedByDateTimeSeparator[0]);
    var valueTimeAndValuePart = valueYearPartSplittedByDateTimeSeparator[1];
    return string.Concat(normalizedDay, '-', normalizedMonth, '-', normalizedYear, ' ', valueTimeAndValuePart);
}       
private static string NormalizeImportDayValue(string value) {
    return value.Length == 2 ? value : "0" + value;
}
private static string NormalizeImportMonthValue(string value) {
    return value.Length == 2 ? value : "0" + value;
}
private static string NormalizeImportYearValue(string value) {
    return value.Length == 4 ? value : DateTime.Now.Year.ToString(CultureInfo.InvariantCulture).Remove(2) + value;
}

答案 2 :(得分:0)

你可以用这个来获取日期和价值。

(((0[1-9]|[12][0-9]|3[01])-(0[1-9]|1[012])-(19|20)\d\d)\s((\d{2}:?){3})|(\d+\.?\d+))

这将为您提供2场比赛

1º18-06-201412:00:00 2º220.6

实施例:  http://regexr.com/391d3

答案 3 :(得分:0)

此正则表达式匹配两种类型的字符串,将两个标记捕获到第1组和第2组。

  • 请注意我们没有使用\d ,因为在.NET中它可以匹配任何Unicode数字,例如泰语......
  • 密钥位于[ |]字符类中,它指定了两个允许的分隔符

这是正则表达式:

^([0-9]{2}-[0-9]{2}-[0-9]{4} (?:[0-9]{2}:){2}[0-9]{2})[ |]([0-9]{3}\.[0-9])$

the demo中,请注意右侧窗格中的捕获组。

以下是检索值的方法:

var myRegex = new Regex(@"^([0-9]{2}-[0-9]{2}-[0-9]{4} (?:[0-9]{2}:){2}[0-9]{2})[ |]([0-9]{3}\.[0-9])$", RegexOptions.IgnoreCase);
string mydate = myRegex.Match(s1).Groups[1].Value;
Console.WriteLine(mydate);
string myvalue = myRegex.Match(s1).Groups[1].Value;
Console.WriteLine(myvalue);

如果您有疑问,请告诉我

答案 4 :(得分:0)

鉴于提供的格式,我会使用类似

的内容
    char delimiter = ' '; //or whatever the delimiter for the specific file is, this can be set in a previous step
    int index = line.LastIndexOf(delimiter);
    var date = line.Remove(index);
    var value = line.Substring(++index);

如果有很多行和效率很重要,你可以在第一行获得一次分隔符,从末尾循环回来,找到第一个不是数字或点的索引(如果值可以包含,则为逗号)那些)确定分隔符,然后使用如上所述的东西。

如果每一行都可以包含不同的分隔符,您可以始终追溯到第一个非值char,如上所述,并且仍然保持足够的性能。

编辑:为了完整起见,要找到分隔符,您可以对每个文件执行以下一次(假设分隔符在文件中保持一致)

    char delimiter = '\0';
    for (int i = line.Length - 1; i >= 0; i--)
    {
        var c= line[i];
        if (!char.IsDigit(c) && c != '.')
        {
            delimiter = c;
            break;
        }
    }