从文件输入创建变量

时间:2016-12-20 17:13:31

标签: c# arrays split

帮助。我是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;如果我想开始添加值。必须有更好的方法。

2 个答案:

答案 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();
}