帮助。我是Perl的人,可以使用Perl在几秒钟内完成这项任务,但我的C#解决方案似乎有点过分。我有一个文件,我已经打开,可以逐行阅读。然后我需要将我读取的一些值转换为数组。
例如,以下是我正在处理的文件中的两行:
"12/19/2016 11:13:30 AM",Error Recovery Histogram: 81920 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
"12/19/2016 11:13:30 AM",Failed Bit Histogram: 3187 78228 469 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
我想要做的是为每条线创建一个数组,并将直方图值存储在数组中。这是在Perl的两行中完成的,但它对C#有点麻烦。这就是我到目前为止所拥有的:
string sERH = "Error Recovery Histogram";
int erhPos = fLine.IndexOf(sERH);
string[] valsERH = new string[16];
string[] separators = { " " };
if (erhPos != -1)
{
string subERH = fLine.Substring((erhPos + sERH.Length + 1));
valsERH = subERH.Split(separators,StringSplitOptions.None);
Console.WriteLine(" {0} - {1} --> {2}", erhPos, sERH.Length, subERH);
for(int a=0; a<valsERH.Count(); a++)
{
Console.WriteLine(" Values in array: {0}={1}", a,valsERH[a]);
}
}
在这里,我可以将整个直方图值字符串转换为字符串&#39; subERH&#39;然后可以使用String.Split方法。这似乎是一种令人难以置信的笨拙的做法。有更有效的方法吗?更不用说,这是当前存储的值为&#39; string&#39;,我仍然需要转换为&#39; int&#39;如果我想开始添加值。必须有更好的方法。
答案 0 :(得分:0)
subString
出于显示目的,您只需使用int
即可。除非您需要将这些int
值传递给其他值,否则根本不需要将它们转换为:
。如果你这样做,那么你可以在那里找出逻辑;因为您正在获取格式化消息,所以您应该能够从CheckStateChangedEvent
开始打破每一个消息。它可能不是优雅的,或2行代码,但它可以工作。
答案 1 :(得分:0)
您可以尝试这样做:
static void Main(string[] args)
{
string[] lines = new string[] {
"\"12/19/2016 11:13:30 AM\",Error Recovery Histogram: 81920 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ",
"\"12/19/2016 11:13:30 AM\",Failed Bit Histogram: 3187 78228 469 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"
};
var timestampDelimiters = new string[] { "," };
var msgDelimiters = new string[] { ":" };
var numberDelimiters = new string[] { " " };
foreach (var line in lines)
{
var msgTokens = line.Split(timestampDelimiters, System.StringSplitOptions.None);
string timestamp = msgTokens[0];
string message = msgTokens[1];
var histTokens = message.Split(msgDelimiters, System.StringSplitOptions.None);
string histogramTitle = histTokens[0];
string histogramValues = histTokens[1];
var entries = histogramValues.Split(numberDelimiters, System.StringSplitOptions.RemoveEmptyEntries);
var numbersList = new System.Collections.Generic.List<int>();
//Iterate through entries and convert them
foreach (var entry in entries)
{
numbersList.Add(System.Convert.ToInt32(entry));
}
// Use it like a List, or convert it to an array with ToArray method
System.Console.Write("{0}: {1} entries", histogramTitle, numbersList.ToArray().Length);
}
System.Console.ReadKey();
}