如何在C#中使用分隔符将文本文件拆分为2d数组?

问题描述 投票:0回答:1

我的文本文件包含诸如以下内容:

1/1/2018;0;29;10
1/2/2018;0;16;1
1/3/2018;0;32;1
1/4/2018;0;34;15
1/5/2018;0;19;2
1/6/2018;0;21;2

进一步在文本文件中是小数点,这就是为什么我尝试使用double的原因

1/29/2018;0.32;52;38
1/30/2018;0.06;44;21

我正在尝试分割分号,并将分号之间的每个值分配到一个包含31行和4列的2D数组中。

private void button1_Click(object sender, EventArgs e)
{
    // 2d array
    double[,] testarray = new double[31, 4];
    string inputFile = File.ReadAllText("testywesty.txt");
    char[] spearator = {';',' '};

    for (int row = 0; row < 31; row++)
    {
        for (int column = 0; column < 4; column++)
        {
            string[] strlist = inputFile.Split(spearator);
            testarray [row,column] = double.Parse(strlist[column]);
        }
    }
}

[我相信我具有将值插入2d数组所需的正确循环,但是,我的输入出现错误,并且我相信这是由于斜线引起的。

我的代码足以将文本文件的内容保存到数组中吗?我该如何处理'/'字符?

c# arrays text-files delimiter
1个回答
0
投票

您会在斜杠上得到一个错误,因为您正试图将它们转换为双精度,这是不可能的。您可以做的一件事是,首先使用该类的DateTime方法将它们转换为Parse,然后使用ToOADate方法将其转换为double。请注意,如果需要将其转换回去,可以像在下面的输出中一样使用DateTime.FromOADate方法。

[另外,使用File.ReadAllLines将文件读入字符串数组可能会有所帮助,其中每个字符串都是文件行(这假设每行都包含您需要的四个部分,如示例中所示)问题中的文件内容)。这样,每行代表一个row,然后我们可以拆分该行以获得我们的columns

例如:

private static void button1_Click(object sender, EventArgs e)
{
    var lines = File.ReadAllLines("testywesty.txt");
    var items = new double[lines.Length, 4];
    var delims = new[] {';', ' '};

    for (var line = 0; line < lines.Length; line++)
    {
        var parts = lines[line].Split(delims);
        var maxParts = Math.Min(parts.Length, items.GetLength(1));

        for (var part = 0; part < maxParts; part++)
        {
            if (part == 0)
            {
                // Parse first item to a date then use ToOADate to make it a double
                items[line, part] = DateTime.Parse(parts[part]).ToOADate();
            }
            else
            {
                items[line, part] = double.Parse(parts[part]);
            }
        }
    }

    // Show the output
    var output = new StringBuilder();
    for (var row = 0; row < items.GetLength(0); row++)
    {
        var result = new List<string>();
        for (var col = 0; col < items.GetLength(1); col++)
        {
            result.Add(col == 0
                ? DateTime.FromOADate(items[row, col]).ToShortDateString()
                : items[row, col].ToString());
        }

        output.AppendLine(string.Join(", ", result));
    }
    MessageBox.Show(output.ToString(), "Results");
}

输出

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.