我将这些数据文件添加到服务器上,我需要将其分成[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
,并且行数可以达到数百万,因此我希望尽可能保持高效。
答案 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
答案 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;
}
}