将文本文件转换为列表<int>(C#)

我以这个link为起点。我是C#的新手,但是有C / C ++的经验。我的目标是重新创建排序算法,并使用分叉使它们相互竞争。我已经成功地重新创建了mergesort,气泡和插入,并计划了已实现的quicksort。

我创建了一个单独的类,该类创建了100,000个随机整数的文件,以正确测试排序算法的速度。

StreamWriter sw = new StreamWriter(@"C:\pathtofile\randomNumbers.txt");

int count = 0;
Random rnd = new Random();
int randomNumber;
int lines = 0;
while (count++ < 100000)
{
    randomNumber = rnd.Next(1,250);
    sw.Write(randomNumber);
    sw.Write(" "); // create white space
    if(lines == 25) //formatting
    {
        sw.WriteLine("");
        lines = 0;
    }
    lines++;
}

我从主类中获取的将这些整数存储到数组列表中的错误现在失败了:

lists.Add(Convert.ToInt32(listInts[j]));
  

//错误:System.FormatException:'输入字符串不正确   格式。'

据我所知,当它转换整数时,它将获取不是整数的值并失败。但是,对我来说令人困惑的部分是当我手动输入整数时,它工作得很好。

例如:134 0 13 42232 48 424 166 109

任何帮助都是有益的。

C#Nooby

miyavi16 回答:将文本文件转换为列表<int>(C#)

正如vetzascoaStas Ivanov所提到的那样,代码中的异常可能是由未处理的空格和空字符串引起的。

要解决此问题,您可以按以下方式修改将测试数据写入文件的方法:

static string Delimiter => " ";
static string LineBreak => "\r\n";

static void WriteTestFile(string fileName,int dataLength = 100000,int dataMinvalue = 1,int dataMaxValue = 250,int lineBreakPosition = 25)
{
    int iterator = 0;
    string delimiter;

    Random rndGenerator = new Random();
    int randomNumber;

    using (var fileStream = new FileStream(fileName,FileMode.Create,FileAccess.Write))
    using (var streamWriter = new StreamWriter(fileStream))
    {
        while (iterator < dataLength)
        {
            randomNumber = rndGenerator.Next(dataMinvalue,dataMaxValue);
            delimiter = ++iterator % lineBreakPosition == 0 ? LineBreak : Delimiter;
            streamWriter.Write($"{randomNumber}{delimiter}");
        }
    }
}

通过这种方式,可以避免每行末尾出现多余的空格。另外,请注意FileStreamStreamReaderStreamWriterIDisposable个对象。因此,它们在using(...)try/finally块内should be used

要读取文件并将其内容转换为List<int>,可以使用以下代码:

static List<int> ReadTestFile(string fileName)
{
    string fileContents;

    using (var fileStream = new FileStream(fileName,FileMode.Open,FileAccess.Read))
    using (var streamReader = new StreamReader(fileStream))
    {
        fileContents = streamReader.ReadToEnd();
    }

    var separators = string.Join("",LineBreak,Delimiter).ToCharArray();
    var query = from item in fileContents
                 .Split(separators,StringSplitOptions.RemoveEmptyEntries)                        
                 select int.Parse(item);

    return query.ToList();
}

使用StringSplitOptions.RemoveEmptyEntries方法生成的exclude empty entries/substrings使用String.Split选项拆分文件内容字符串。这将确保无错误的字符串到整数的转换。

下面,您可以找到解决问题的完整的最低限度的解决方案。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace FileToListInt
{
    class Program
    {
        static readonly string filePath = "randomNumbers.txt";

        static string Delimiter => " ";
        static string LineBreak => "\r\n";

        static void WriteTestFile(string fileName,int lineBreakPosition = 25)
        {
            int iterator = 0;
            string delimiter;

            Random rndGenerator = new Random();
            int randomNumber;

            using (var fileStream = new FileStream(fileName,FileAccess.Write))
            using (var streamWriter = new StreamWriter(fileStream))
            {
                while (iterator < dataLength)
                {
                    randomNumber = rndGenerator.Next(dataMinvalue,dataMaxValue);
                    delimiter = ++iterator % lineBreakPosition == 0 ? LineBreak : Delimiter;
                    streamWriter.Write($"{randomNumber}{delimiter}");
                }
            }
        }

        static List<int> ReadTestFile(string fileName)
        {
            string fileContents;

            using (var fileStream = new FileStream(fileName,FileAccess.Read))
            using (var streamReader = new StreamReader(fileStream))
            {
                fileContents = streamReader.ReadToEnd();
            }

            var separators = string.Join("",Delimiter).ToCharArray();
            var query = from item in fileContents
                         .Split(separators,StringSplitOptions.RemoveEmptyEntries)                        
                         select int.Parse(item);

            return query.ToList();
        }

        static void Main(string[] args)
        {
            // Writing data to a test file
            WriteTestFile(filePath);

            // Reading result into a List<int>
            List<int> data = ReadTestFile(filePath);

            // Checking the number of readings
            Console.WriteLine(data.Count);

            // Deleting test file
            if (File.Exists(filePath))
                File.Delete(filePath);
        }
    }
}

,

看着您遇到的错误,在我看来,您没有考虑换行符(至少我能够以此方式重现它)。

这是我对包含新行的文件的工作方式(我使用了 Split 的重载,该重载接受要分割的字符数组,此外,由于提供的 StringSplitOptions ):

using (var reader = new StreamReader(@"c:\temp\test.txt"))
{       
    var text = await reader.ReadToEndAsync();       
    var numbers = text.Split(new [] {' ','\n','\r' },StringSplitOptions.RemoveEmptyEntries).Select(word => Convert.ToInt32(word));
    // do something with numbers (IEnumerable<Int32>)
}

上面的代码将数字存储到 IEnumerable 集合中。如果需要数组,则应调用 ToArray()

,

我可以给你两个解决方案。 其中之一是修改用于创建带有数字文件的代码。 另一个是从您告诉我们的链接中修改您正在使用的代码。

当您将空白写入文件时,代码中的问题出在while循环内:

randomNumber = rnd.Next(1,250);
sw.Write(randomNumber);
sw.Write(" "); // create white space  <------ this line

此行总是在数字后面写一个空格。这意味着您的文件将以空格结尾,而不是数字。这会导致该行出现异常

lists.Add(Convert.ToInt32(listInts[j])); 

因为文件生成的listInts [j] =“”中的最后一行。

第一个可能的解决方案

当您要在文件中写入空白时,请仅在写入最后一个数字后才写入。 您的while循环应类似于以下内容:

while (count++ < 100000)
{
    randomNumber = rnd.Next(1,250);
    sw.Write(randomNumber);
    if (count < 100000) //avoid write a white space if is last number to write
    {
        sw.Write(" "); // create white space
    }
    if(lines == 25) //formatting
    {
        sw.WriteLine("");
        lines = 0;
    }
    lines++;
}

第二种可能的解决方案

在您用来读取文件的代码中,只需使用函数.Trim()拆分成数组,然后从每一行中删除空白即可。

String[] listInts = listLines[i].Trim().Split(' ');

代替当前行

String[] listInts = listLines[i].Split(' ');
本文链接:https://www.f2er.com/3085629.html

大家都在问