获取文本数据并将其拆分为c#中的2个单独的1D数组

时间:2012-11-01 23:47:48

标签: c# arrays input

我正在研究一个项目而且我完全陷入困境。我基本上需要从文件中读取文本数据,格式如下:

每行4个数字用逗号分隔(没有多少行的硬集,这个程序应该可以在任意数量的行上工作)

2, 32, 4, 7
4, 8, 3, 8
33, 11, 56, 65

基本上我需要的是这个文本文档中的0元素和第3个(最后)元素,我需要将它们转换为整数并将它们放入自己的数组中:

所以对于0个元素我会有一个数组(如果使用上面的文本示例):

zeroArray[] = 2, 4, 33
thirdArray[] = 7, 8, 65

所以,如果我说zeroArray[1]它将是4,如果我说thirdArray[0]它会说7(*这是使用上面的示例数据,它需要能够使用任何数字)

我需要将这些数据转换为int并在他们自己的数组中,以便我以后可以对每个元素进行计算。我需要能够调用将执行这些计算的方法(我将编写)。

这是我遇到的问题。

  1. 我无法将intArray拉出while循环,因为它是在while循环中声明的,这是它的作用域。但是如果我尝试从while循环中声明intArray,它会给我错误'使用未分配的局部变量intArray。当我在while循环中声明它并尝试在while循环之外使用intArray时,它会给出错误the name intArray does not exist in the current context。所以我的主要问题是我需要能够访问intArray,以便我可以将其用作我的方法的参数来执行计算。

  2. 我的第二个问题是intArray基本上包含了所有4行数据。如果我打印intArray[0],它会打印出列出的所有第一个数字(使用上面的示例文本),它会打印出来:

    2 4 33

  3. 如果我打印intArray [3],它会打印出文本数据中的所有第4个整数,如下所示:

    7
    8
    65
    

    我假设我需要做的是再制作两个数组,一个用于保存文本的第一个元素,第二个用于保存文本的第四个元素,因为这些需要以不同方式处理。

    我试图制作数组来存储这些数据,但无论我尝试什么,它都不起作用。 而不是zeroArray[0] = 2,当我打印它时,它给了我整个列表:

    2
    4
    33
    

    如果我打印zeroArray[1],期待4,它会再次打印出整个列表

    2
    4
    33
    

    不幸的是我只能使用循环和1D数组。我不能使用列表,OOP或2D数组。因此,如果我可以使用列表/ 2D数组,则编码效率不高。

    我目前将值存储到int数组intArray中,因为我不知道如何创建一个能够将不同值存储到两个不同数组中的for循环。我真的想不出办法这样做。我试过的任何方法都失败了。

    我可以使用两个数组而不是List吗? intArray确实保存转换后的整数值(4个不同的部分,我只需要其中2个进行计算)。反正有没有创建两个包含intArray[0]intArray[3]值的数组,以便我可以继续使用它们进行计算?另外我怎么能这样做,所以我可以在循环外使用这两个数组?如果我在循环外创建一个数组,它将不允许我在循环中使用它,如果我在循环中创建一个数组,它将不允许我在循环之外使用它。

    非常感谢任何帮助

    附带的代码是目前正在使用的代码。由于我无法弄清楚如何正确存储两个数组,因此它们尚未包含在我的代码中

    static void Main(string[] args)
    {
    
        //declarations
        string inputString = "";
        string[] results;
        int holder = 0;
    
        //import file for reading
        FileStream inFile = new FileStream("input.txt", FileMode.Open, FileAccess.Read);
        StreamReader myStream = new StreamReader(inFile);
    
        //reads first line
        inputString = myStream.ReadLine();
    
    
        while (inputString != null)
        {
            //split the line
            results = inputString.Split(',');
            int[] intArray = new int[results.Length];
    
    
            //do whatever processing you need to do to store it
    
    
            for (int index = 0; index < results.Length; index++)
            {
                if (int.TryParse(results[index], out holder))
                {
                    intArray[index] = holder;
                }//end if
            }//end for
    
        //reads next line
        inputString = myStream.ReadLine();
    
    
    
        }//end while
    
        //This is a test to see if the ints are correctly stored
        Console.WriteLine(intArray[0]);  //<--error here stating that 'The name intArray' does not exist in the current context'
    
    }//end main
    

4 个答案:

答案 0 :(得分:2)

最简单的方法是使用List而不是数组,因为你不知道你的文件有多少行,如果你想使用列表的ToArray()方法,你可以轻松地从列表中获取数组。 编辑:由于您已在评论中声明需要数组,因此会针对该用途调整代码。如果每行有四个数字,则此代码可能适合您。我警告你,我从不检查连续数字是否少于四个:

static void Main(string[] args) {
        {

            //declarations
        string inputString = "";
        string[] results;
        int holder = 0;
        int []zeroArray = new int[100];
        int []thirdArray = new int[100];

        //import file for reading
        FileStream inFile = new FileStream("input.txt", FileMode.Open, FileAccess.Read);
        StreamReader myStream = new StreamReader(inFile);

        //reads first line
        inputString = myStream.ReadLine();
        int count = 0;
        while (inputString != null)
        {
            //split the line
            results = inputString.Split(new char [] {','},StringSplitOptions.RemoveEmptyEntries);
            if (int.TryParse(results[0].Trim(), out holder))
            {
                zeroArray[count] = holder;
            }
            if (int.TryParse(results[3].Trim(), out holder))
            {
                thirdArray[count] = holder;
            }
            count++;
            if(count == zeroArray.Length)
            {
                int capacity = zeroArray.Length;
                int []oldArray = zeroArray;
                zeroArray = new int[2*capacity];
                oldArray.CopyTo(zeroArray,0);
                oldArray = thirdArray;
                thirdArray = new int[2*capacity];
                oldArray.CopyTo(thirdArray,0);
            }
            //reads next line
            inputString = myStream.ReadLine();
        }//end while


     }//end main

请注意,您必须定期检查数组的容量是否超出,如果是,则应使新实例的容量增加一倍,并将旧实例复制到新实例。此外,完成后,count将保留每个数组中的数字。

答案 1 :(得分:0)

运行一次文件并计算行数。然后,您可以通过第二次运行声明数组并读取数据。

static void Main(string[] args)
{

    //declarations
    string inputString = "";
    string[] results;
    int holder = 0;
    int lines = 0;

    //import file for reading
    FileStream inFile = new FileStream("input.txt", FileMode.Open, FileAccess.Read);
    StreamReader myStream = new StreamReader(inFile);

    //reads first line
    inputString = myStream.ReadLine();

    while(inputString != null){
        lines++;
    }

    int[] zeroArray = new int[lines], thirdArray = new int[lines];

    FileStream inFile = new FileStream("input.txt", FileMode.Open, FileAccess.Read);
    StreamReader myStream = new StreamReader(inFile);

    //reads first line
    inputString = myStream.ReadLine();

    for(int line = 0 ; line < ilnes; line++)
    {
        //split the line
        results = inputString.Split(',');
        zeroArray[line] = int.Parse(results[0]);
        thirdArray[line] = int.Parse(results[3]);

        inputString = myStream.ReadLine();
    }//end for

    //zeroArray and thirdArray should have your info now

}//end main

我能想到的唯一另一个选择是避免两次阅读文件是根据需要手动调整zeroArraythirdArray的大小,因为你不知道它们的开头有多大。这就是List<int>之类的内部工作方式。

//need to resize
int[] newArray = new int[oldArray.Length *2];
for(int i=0; i<oldArray.Length; i++){
    newArray[i] = oldArray[i];
}
oldArray = newArray;

答案 2 :(得分:0)

你是不是很有感情?会很容易的

 var splitted = System.IO.File.ReadAllLines("input.txt")
       .Select(i => i.Split(',')).ToArray();
 var zeroArray = splitted.Select(s => s[0]).ToArray();
 var thirdArray = splitted.Select(s => s[3]).ToArray();

答案 3 :(得分:0)

这是我尝试和完美的工作。希望它对你有所帮助。快乐分享知识

    using (StreamReader sr = new StreamReader(@"C:\Users\Administrator\Documents\test.txt"))
    {
        int[] ZeroArray = null;
        int[] ThirdArray = null;

        int[] ZeroArrayTemp = null;
        int[] ThirdArrayTemp = null;

        int[] tempZero = null;
        int[] tempThird = null;

        int i = 0;

        do
        {
            i++;
            string line = sr.ReadLine();
            string[] values = line.Split(',');

            //get value for ZeroArray
            int valueZero = int.Parse(values[0]);

            //get value for ThirdArray
            int valueThird = int.Parse(values[2]);

            ZeroArrayTemp = new int[i + 1];
            ThirdArrayTemp = new int[i + 1];

            if (tempZero != null)
            {
                for (int j = 0; j < tempZero.Length - 1; j++)
                {
                    ZeroArrayTemp[j] = tempZero[j];
                }
            }

            if (tempThird != null)
            {
                for (int j = 0; j < tempThird.Length - 1; j++)
                {
                    ThirdArrayTemp[j] = tempThird[j];
                }
            }

            ZeroArrayTemp.SetValue(valueZero, i - 1);
            ThirdArrayTemp.SetValue(valueThird, i - 1);

            tempZero = ZeroArrayTemp;
            tempThird = ThirdArrayTemp;

        }while(sr.Peek() != -1);

        //Copy valid value to final array
        ZeroArray = new int[ZeroArrayTemp.Length - 1];
        Array.Copy(ZeroArrayTemp, ZeroArray, ZeroArrayTemp.Length - 1);

        ThirdArray = new int[ThirdArrayTemp.Length - 1];
        Array.Copy(ThirdArrayTemp, ThirdArray, ThirdArrayTemp.Length - 1);

    }