0

コンマで区切られた数字を含むテキスト ファイルを読み込もうとしています。を使用して読むFile.Readline()と、string[]. int 配列に変換する必要がありますが、エラーが発生します。

テキストファイルの内容:

146429,143689,144380,141523,139572,136930,133714,130011,125843,121110,115974,110363,104367,97909,91245,84218,77008,69626,62058,54445,46942,39436,32146,24932,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++;
}
4

4 に答える 4

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

編集

モンローが指摘したように、私はあなたが配列の配列を望んでいたという事実を見逃しました。このようなギザギザの配列を提供する別のバージョンがあります。それでも歩留まりを維持します;)

    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();
        }
    }
于 2012-07-14T23:06:59.943 に答える
1

を使用Listすると役立ち、使用するStringSplitOptions.RemoveEmptyEntriesと予防できますnull exceptionConvert.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();  
于 2012-07-14T23:11:37.077 に答える
0

それはほぼ次のようになるはずです:

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

もちろん、堅牢性を高めるにint.Parseは、数値のエラーを処理する方法などに置き換える必要があります...

編集:

ああ、配列の別のインデックスである行があることに気付きました... では、その場合はこのコードを変更する必要がありますが、それはあなたに任せます。

于 2012-07-14T23:21:41.160 に答える
0

これがあなたのやりたいことだと思います。唯一のことは、 vallArr がすべての値を保持できる 2 次元配列である必要があることです。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++;
        }
于 2012-07-14T23:23:59.833 に答える