【问题标题】:How to read a text file and add the data to a int array in C#?如何读取文本文件并将数据添加到 C# 中的 int 数组?
【发布时间】:2012-07-14 22:49:39
【问题描述】:

我正在尝试读取包含用逗号分隔的数字的文本文件。当我使用File.Readline() 阅读时,我将其发送到string[]。我需要将它转换为一个 int 数组,但它给出了一个错误。

文本文件的内容:

146429,143689,144380,141523,139572,136930,133714,130011,130011,125843,125843,121110,115974,115974,110499799799799799979999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,1399999,139、运动物,18359,12601,9039,9776,13638,18314,23221,27728,32142,35941,39577,42657,45692,48180

我的代码:

while ((line = sr.ReadLine()) != null)
{
    string[] values = line.Split(new string[] { " , " }, StringSplitOptions.None); 

    for (int i = 0; i < values.Length; i++)
    {
        // Console.WriteLine(values[i]);
        valArr[LineCount][i] = Convert.ToInt64(values[i]); // error
    }

    LineCount++;
}

【问题讨论】:

标签: c# arrays text io


【解决方案1】:

我想这就是你所追求的:

    static void Main(string[] args)
    {
        var sr = new StreamReader(@"d:\test.txt");
        long[] data = ExtractData(sr).ToArray();
    }

    private static IEnumerable<long> ExtractData(StreamReader sr)
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            var items = line.Split(',');
            foreach (var item in items)
            {
                yield return Convert.ToInt64(item);
            }
        }
    }

我的测试文件 (d:\test.txt) 持有:

1,2,3,4,5
1,2,3,4

我得到的数组包含:

1,2,3,4,5,1,2,3,4

编辑

正如 Monroe 指出的那样,我错过了您想要一个数组的事实。这是另一个提供这种锯齿状数组的版本。尽管如此,仍然保持收益;)

    static void Main(string[] args)
    {
        var sr = new StreamReader(@"d:\test.txt");
        var data = ExtractData(sr).ToArray();
    }

    private static IEnumerable<long[]> ExtractData(StreamReader sr)
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            yield return line.Split(',').Select(i => Convert.ToInt64(i)).ToArray();
        }
    }

【讨论】:

  • 为什么要感谢好心的先生!遵循 LINQ 样式以降低内存使用量并避免使用其他集合。那,我只是喜欢收益回报:)
  • 如果我更改代码以返回一个 long[][]。怎么样?顺便说一句,谢谢帮了我很多
  • 这会提取所有值,但不会保留 OP 似乎正在争取的行号上下文。
  • 啊,我错过了。我已经更新了我的答案以提供另一种选择。
【解决方案2】:

使用List可以帮助你,使用StringSplitOptions.RemoveEmptyEntries可以防止null exception进入Convert.ToInt64

var lineArray = new List<List<Int64>>();

foreach (var lineString in File.ReadAllLines("path"))
{
    var line = new List<Int64>();
    string[] values = lineString.Split(new[] { ',', ' ' },  
                                       StringSplitOptions.RemoveEmptyEntries);
    line.AddRange(values.Select(t => Convert.ToInt64(t)));
    lineArray.Add(line);
}

并使用它:

// Array of numbers for specific line
var resultArray = lineArray[lineNumber].ToArray();  

【讨论】:

  • 为什么使用Dictionary&lt;int, List&lt;Int64&gt;&gt; 而不是List&lt;List&lt;Int64&gt;&gt;
【解决方案3】:

应该是这样的:

int yourIntArray = 
    new List<string>(RealAllText(fileName)
    .Split(new char[] {',', '\r', '\n', ' '},
    stringSplitOptions.RemoveEmptyEntries))
    .ConvertAll<int>(s => int.Parse(s))
    .ToArray();

当然,为了更健壮,int.Parse 应该替换为一些可以处理数字错误的方法,等等...

编辑:

哦,我刚刚看到你的行是数组的另一个索引...那么,在这种情况下应该修改这段代码,但我会把它留给你。

【讨论】:

    【解决方案4】:

    我认为这就是你想要做的。唯一的问题是您的 vallArr 应该是一个可以保留所有值的二维数组。类似 var valArr = new Int64[x, y];

            while ((line = sr.ReadLine()) != null)
            {
                string[] values = line.Split(new string[] { " , " }, StringSplitOptions.None);
    
                for (int i = 0; i < values.Length; i++)
                {
                    valArr[LineCount, i] = Int64.Parse(values[i]);
                }
                LineCount++;
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-14
      • 2015-01-05
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多